上一篇博客写了TCP的文本上传,可是在平时上传的文件大多数不是文本,本篇博客再介绍一下图片的上传。
先是客户端:
//创建客户端socket服务
Socket s=new Socket("10.152.79.174", 1004);
//读取要上传的图片文件
FileInputStream fis=new FileInputStream("d:\\015.jpg");
//获取socket输出流,将图片数据发送到服务端
OutputStream os=s .getOutputStream();
byte[] buf=new byte[1024];
int len=0;
while ((len=fis.read(buf))!=-1) {
os.write(buf, 0, len);
}
//通知服务端数据发送完毕,让服务端停止读取。
s.shutdownOutput();
//读取服务端返回的内容,
InputStream in=s.getInputStream();
byte[] bufIn=new byte[1024];
int lenin=in.read(buf);
String text=new String(buf,0,lenin);
System.out.print(text);
fis.close();
s.close();
然后是服务端:
//创建服务端socket端口
ServerSocket ss=new ServerSocket(1004);
//获取客户端
Socket s=ss.accept();
//读取客户端发来的数据
InputStream is=s.getInputStream();
//将读取到的数据存储到
File dir=new File("d:\\pic");
if (!dir.exists()) {
dir.mkdirs();
}
String ip=s.getInetAddress().getHostName();
System.out.println(ip+"......connected");
File file=new File(dir, ip+".jpg");
FileOutputStream fos=new FileOutputStream(file);
byte[] buf=new byte[1024];
int len=0;
while ((len=is.read())!=-1) {
fos.write(buf, 0, len);
}
//获取socket输出流,将上传成功的消息返回给客户端
OutputStream os=s.getOutputStream();
os.write("上传成功!".getBytes());
fos.close();
s.close();
ss.close();
这样基本就实现了图片上传功能,但是作为一个Demo是可以的,但离实用标准还差很远。比如说服务端有多人同时访问可是上面的代码每次只能处理一个客户端的连接。所以要实现多个客户端的并发访问,就要实用多线程。修改后的代码如下:
//创建tcp的socket服务端。
ServerSocket ss = new ServerSocket(10006);
while(true){
Socket s = ss.accept();
new Thread(new UploadTask(s)).start();
}
UploadTask的代码如下:
public class UploadTask implements Runnable {
private static final int SIZE = 1024*1024*2;
private Socket s;
public UploadTask(Socket s) {
this.s = s;
}
@Override
public void run() {
int count = 0;
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ".....connected");
try{
// 读取客户端发来的数据。
InputStream in = s.getInputStream();
// 将读取到数据存储到一个文件中。
File dir = new File("c:\\pic");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, ip + ".jpg");
//如果文件已经存在于服务端
while(file.exists()){
file = new File(dir,ip+"("+(++count)+").jpg");
}
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
if(file.length()>SIZE){
System.out.println(ip+"文件体积过大");
fos.close();
s.close();
System.out.println(ip+"...."+file.delete());
return ;
}
}
// 获取socket输出流,将上传成功字样发给客户端。
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}catch(IOException e){
}
}
}
这样才算一个真正的实现了图片上传功能。