zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    解决流氓软件的工具,做个记录
    目前使用较好的网盘搜索引擎
    网页截图分段保存
    国外统计学课程主页Statistical Books, Manuals and Journals
    notepad++ TextFX替代
    只用 4 个月打造机器学习必备技能,这位工程师成功翻转职涯人生
    时序差分学习
    来自NVIDIA开源的pix2pixHD,将Image-to-Image Translation带到了另一个境界
    关于HTML5,最牛逼的10本书!
    IDEA配置和插件
  • 原文地址:https://www.cnblogs.com/csslcww/p/9207993.html
Copyright © 2011-2022 走看看