1. 程式人生 > 實用技巧 >(4)優化TCP編寫 客服端上傳圖片,服務端給客服端發訊息問好

(4)優化TCP編寫 客服端上傳圖片,服務端給客服端發訊息問好

(4)優化TCP編寫 客服端上傳圖片,服務端給客服端發訊息問好

此demo的在上一個的基礎上實現客服端與伺服器端互相傳送訊息給對方,提高資料的讀與取的效率,首先要先啟動服務端,否則報錯,因為TCP是可靠協議,所以沒有對應的服務端時會報錯,傳送資料為圖片

一.編寫TCP協議服務端

 1   package demo.soket.tcp;
 2  3   import java.io.BufferedInputStream;
 4   import java.io.BufferedOutputStream;
 5   import java.io.FileOutputStream;
 6
import java.io.IOException; 7 import java.io.OutputStream; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 11 //TCP協議服務端 12 public class Server { 13 public static void main(String[] args) { 14 /** 15 * 1.建立服務端ServerSocket物件 16 * 2.監聽socket連線
17 * 3.通過返回的socket物件來獲取io流裡面的資料 18 * 4.列印資料 19 */ 20 //1. 21 ServerSocket server=null; 22 try { 23 server=new ServerSocket(12345); 24 //2. 25 Socket client=server.accept(); 26 //3. 27 //
位元組緩衝輸入流,效率高 28 BufferedInputStream bis=new BufferedInputStream(client.getInputStream()); 29 System.out.println("bis"+bis); 30 31 //給客服端發訊息 32 OutputStream out=client.getOutputStream(); 33 String result="歡迎你的到來:"+client.getLocalAddress(); 34 out.write(result.getBytes()); 35 36 //接收客服端胡訊息 37 BufferedOutputStream os=new BufferedOutputStream(new FileOutputStream("客戶端發過來的圖片.jpg")); 38 byte[] b=new byte[1024]; 39 int len=0; 40 while((len=bis.read(b))!=-1) { 41 os.write(b, 0, len); 42 os.flush();//刷出緩衝流中的資料,關閉連線前一定要刷,否則會資料缺失 43 } 44 //緩衝流 45 os.close(); 46 client.close(); 47 bis.close(); 48 server.close(); 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } 52 } 53 }


二.編寫TCP協議客服端

 1  package demo.soket.tcp;
 2  3   import java.io.BufferedInputStream;
 4   import java.io.BufferedOutputStream;
 5   import java.io.FileInputStream;
 6   import java.io.IOException;
 7   import java.io.InputStream;
 8   import java.net.Socket;
 9   import java.net.UnknownHostException;
10 11   /**
12    * TCP特點:
13    * 1.建立連線,形成傳輸資料的通道
14    * 2.在連結中進行大量資料傳輸
15    * 3.通過三次握完成連線,是可靠協議,所以沒有對應的服務端時會報錯
16    * 4.必建立連線,效率會稍低些
17    * @author Administrator
18    *
19    */
20   public class Client {
21       public static void main(String[] args) {
22           /**
23            * 1.建立一個客服端的socket物件
24            * 2.建立連線
25            * 3.通過io流在管道里面傳輸資料
26            * 寫資料:輸出流 getOutputStream() 
27            * 接收資料:輸入流 getInputStream() 
28            * 4.關閉socket
29            */
30           //1.|2.
31           Socket client=null;
32           try {
33               client=new Socket("192.168.95.2",12345);
34               //3.
35               BufferedOutputStream os=new BufferedOutputStream(client.getOutputStream());
36               String path="C:\\Users\\Administrator\\Pictures\\微信圖片_20200629170031.jpg";
37               BufferedInputStream buf=new BufferedInputStream(new FileInputStream(path));
38               byte[] b=new byte[1024];
39               int len=0;
40               while((len=buf.read(b))!=-1) {
41                   os.write(b, 0, len);
42                   os.flush();//關閉連線前一定要刷,否則會資料缺失
43               }
44               
45               //獲取服務端發過來的訊息
46               InputStream in=client.getInputStream();
47               byte[] bi=new byte[1024];
48               int leng=0;
49               while((leng=in.read(bi))!=-1) {
50                   System.out.println("收到伺服器通知:"+new String(bi,0,leng));
51               }
52               //關閉讀檔案操作
53               buf.close();
54               os.close();
55           } catch (UnknownHostException e) {
56               e.printStackTrace();
57           } catch (IOException e) {
58               e.printStackTrace();
59           }finally {
60               //4.
61               if(client!=null) {
62                   try {
63                       client.close();
64                   } catch (IOException e) {
65                       e.printStackTrace();
66                   }
67               }
68           }
69       }
70   }


三 .demo執行

重新整理專案後會多一張上傳的圖片