(3)优化TCP编写客服端和服务端(上传图片)

(3)优化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.net.ServerSocket;
 8   import java.net.Socket;
 9 10   //TCP协议服务端
11   public class Server {
12       public static void main(String[] args) {
13           /**
14            * 1.创建服务端ServerSocket对象
15            * 2.监听socket连接
16            * 3.通过返回的socket对象来获取io流里面的数据
17            * 4.打印数据
18            */
19           //1.
20           ServerSocket server=null;
21           try {
22               server=new ServerSocket(11111);
23               //2.
24               Socket client=server.accept();
25               //3.
26               //字节缓冲输入流,效率高
27               BufferedInputStream bis=new BufferedInputStream(client.getInputStream());
28               BufferedOutputStream os=new BufferedOutputStream(new FileOutputStream("客户端发过来的图片.jpg"));
29               byte[] b=new byte[1024];
30               int len=0;
31               while((len=bis.read(b))!=-1) {
32                   os.write(b, 0, len);
33                   os.flush();//刷出缓冲流中的数据,关闭连接前一定要刷,否则会数据缺失
34               }
35               //缓冲流
36               os.close();
37               client.close();
38               bis.close();
39               server.close();
40           } catch (IOException e) {
41               e.printStackTrace();
42           }
43       }
44   }

二.编写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.net.Socket;
 8   import java.net.UnknownHostException;
 9 10   /**
11    * TCP特点:
12    * 1.建立连接,形成传输数据的通道
13    * 2.在链接中进行大量数据传输
14    * 3.通过三次握完成连接,是可靠协议,所以没有对应的服务端时会报错
15    * 4.必建立连接,效率会稍低些
16    * @author Administrator
17    *
18    */
19   public class Client {
20       public static void main(String[] args) {
21           /**
22            * 1.创建一个客服端的socket对象
23            * 2.建立连接
24            * 3.通过io流在管道里面传输数据
25            * 写数据:输出流 getOutputStream() 
26            * 接收数据:输入流 getInputStream() 
27            * 4.关闭socket
28            */
29           //1.|2.
30           Socket client=null;
31           try {
32               client=new Socket("192.168.95.2",11111);
33               //3.
34               BufferedOutputStream os=new BufferedOutputStream(client.getOutputStream());
35               String path="C:\Users\Administrator\Pictures\微信图片_20200629170031.jpg";
36               BufferedInputStream buf=new BufferedInputStream(new FileInputStream(path));
37               byte[] b=new byte[1024];
38               int len=0;
39               while((len=buf.read(b))!=-1) {
40                   os.write(b, 0, len);
41                   os.flush();//关闭连接前一定要刷,否则会数据缺失
42               }
43                //关闭读文件操作
44               buf.close();
45               os.close();
46           } catch (UnknownHostException e) {
47               e.printStackTrace();
48           } catch (IOException e) {
49               e.printStackTrace();
50           }finally {
51               //4.
52               if(client!=null) {
53                   try {
54                       client.close();
55                   } catch (IOException e) {
56                       e.printStackTrace();
57                   }
58               }
59           }
60       }
61   }

三 .demo运行

刷新项目后会多一张上传的图片

原文地址:https://www.cnblogs.com/KdeS/p/13274476.html