上一篇博客寫了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){ } } }