tcp文件上传优化

1.client

 1 public static void main(String[] args) throws IOException {
 2         // 创建服务器端的Socket对象
 3         ServerSocket ss = new ServerSocket(11111);
 4 
 5         // 监听客户端连接
 6         Socket s = ss.accept();// 阻塞
 7 
 8         // 封装通道内的流
 9         BufferedReader br = new BufferedReader(new InputStreamReader(
10                 s.getInputStream()));
11         // 封装文本文件
12         BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
13 
14         String line = null;
15         while ((line = br.readLine()) != null) { // 阻塞
16         // if("over".equals(line)){
17         // break;
18         // }
19             bw.write(line);
20             bw.newLine();
21             bw.flush();
22         }
23 
24         // 给出反馈
25         BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(
26                 s.getOutputStream()));
27         bwServer.write("文件上传成功");
28         bwServer.newLine();
29         bwServer.flush();
30 
31         // 释放资源
32         bw.close();
33         s.close();
34     }

2.server


按照我们正常的思路加入反馈信息,结果却没反应。为什么呢?
  读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。
  所以,服务器根本就不知道你结束了。而你还想服务器给你反馈。所以,就相互等待了
如何解决呢?
  A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。
    这样做可以解决问题,但是不好。
  B:Socket对象提供了一种解决方案
    public void shutdownOutput()

 1 public static void main(String[] args) throws IOException {
 2         // 创建客户端Socket对象
 3         Socket s = new Socket("192.168.12.92", 11111);
 4 
 5         // 封装文本文件
 6         BufferedReader br = new BufferedReader(new FileReader(
 7                 "InetAddressDemo.java"));
 8         // 封装通道内流
 9         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
10                 s.getOutputStream()));
11 
12         String line = null;
13         while ((line = br.readLine()) != null) { // 阻塞
14             bw.write(line);
15             bw.newLine();
16             bw.flush();
17         }
18         
19         //自定义一个结束标记
20 //        bw.write("over");
21 //        bw.newLine();
22 //        bw.flush();
23         
24         //Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
25         s.shutdownOutput();
26 
27         // 接收反馈
28         BufferedReader brClient = new BufferedReader(new InputStreamReader(
29                 s.getInputStream()));
30         String client = brClient.readLine(); // 阻塞
31         System.out.println(client);
32 
33         // 释放资源
34         br.close();
35         s.close();
36     }
原文地址:https://www.cnblogs.com/csslcww/p/9207993.html