上一篇博客寫了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();
//創建tcp的socket服務端。
ServerSocket ss = new ServerSocket(10006);
while(true){
Socket s = ss.accept();
new Thread(new UploadTask(s)).start();
}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){
}
}
}