客户端需求:把一个图片文件发送到服务端并读取回馈信息。要求判断文件是否存在及格式是否为jpg或gif并要求文件小于2M。
服务端需求:接收客户端发送过来的图片数据。进行存储后,回馈一个 上传成功字样。支持多用户的并发访问。
//客户端///
public class UploadPicClient {
public static void main(String[] args) {
JFileChooser jfc=new JFileChooser();//弹出文件选择框
int sel=jfc.showOpenDialog(null);//获取选择
if(sel==JFileChooser.APPROVE_OPTION){
File file=jfc.getSelectedFile();//得到选择的文件
if(file.isDirectory()){//判断文件是否是文件夹,一般是不会出现这个的,这里只是简单地写一下
JOptionPane.showMessageDialog(null, "文件选择错误,只能上传文件!");
return;
}
if(!(file.getName().endsWith(".jpg")||file.getName().endsWith("gif"))){//用endsWith判断其后缀名
JOptionPane.showMessageDialog(null, "选择文件格式不正确");
return;
}
if(file.length()>2*1024*1024){//判断文件的额大小是否符合要求
JOptionPane.showMessageDialog(null, "选择文件大小已超过2M不可上传");
return;
}
//满足上传的条件
try {
//Client声明Socket
Socket s=new Socket(InetAddress.getByName("127.0.0.1"),9999);
//获得名字InetAddress.getByName("127.0.0.1")
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bout=new BufferedOutputStream(s.getOutputStream());
byte buf[]=new byte[2*1024*1024];//因为限制了文件的额大小所以这里就直接用2M
int len=0;
while((len=bis.read(buf))!=-1){
bout.write(buf,0,len);
bout.flush();
}
s.shutdownOutput();//停止发送标志
InputStream in=s.getInputStream();//获得反馈信息
byte buf2[]=new byte[64];
int len2= in.read(buf2);
String strecho=new String(buf2,0,len2);
System.out.println(strecho);
bis.close();//一定要关流
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//服务器///
public class UploadServer {
public static void main(String[] args) {
try {
// 声明ServerSocket 来等待握手
ServerSocket server = new ServerSocket(9999);
//在这里main用来接收每接收一次就开一个线程,因为题目的要求就是支持多用户运行
while (true) {Socket s = server.accept();
new Thread(new Receive(s)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Receive implements Runnable {
private Socket s = null;
public Receive(Socket s) {//写构造函数
this.s = s;
}
@Override
public void run() {
String ip = s.getInetAddress().getHostAddress();//获得ip
// 源:s.getInputStream()
// 目的:FileOutputStream ---文件名设计: IP(1).jpg, IP(2).jpg ....
// 文件存放位置处理
File dir = new File("f:\\pics");
if (!dir.exists()) {
dir.mkdirs();
}
// 文件对象处理(最主要是考虑文件名的生成)
int count = 1;
File file = new File(dir, ip + "(" + (count++) + ").jpg");
while (file.exists()) {
file = new File(dir, ip + "(" + (count++) + ").jpg");
}
try {
FileOutputStream out = new FileOutputStream(file);
InputStream in = s.getInputStream();
byte buf[] = new byte[2 * 1024 * 1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
OutputStream out2 = s.getOutputStream();
out2.write("图片文件上传成功".getBytes());
s.close();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}