zoukankan      html  css  js  c++  java
  • java 26

    TCP练习:

    1、客户端键盘录入,服务器输出文本文件

      客户端代码:

     1 public class ClientDemo {
     2     public static void main(String[] args) throws IOException {
     3 
     4         // 创建socket对象
     5         Socket s = new Socket("172.19.12.233", 10010);
     6 
     7         // 创建键盘输入流,用转换流包装成字符流
     8         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     9 
    10         // 把通道中的字节流用转换流包装成字符流
    11         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    12                 s.getOutputStream()));
    13         
    14         //读取键盘输入的数据,并传输到服务器端
    15         String line = null;
    16         while((line = br.readLine()) != null){
    17             //设定个关闭键盘的命令
    18             if(line.equals("esc")){
    19                 break;
    20             }
    21             bw.write(line);
    22             bw.newLine();
    23             bw.flush();
    24         }
    25         //释放资源
    26         s.close();
    27         
    28     }
    29 }

      服务器代码:

     1 public class ServerDemo {
     2     public static void main(String[] args) throws IOException {
     3 
     4         // 创建ServerSocket对象,监听
     5         ServerSocket ss = new ServerSocket(10010);
     6 
     7         // 创建socket对象
     8         Socket s = ss.accept();
     9 
    10         // 把通道中的字节流包装成字符流
    11         BufferedReader br = new BufferedReader(new InputStreamReader(
    12                 s.getInputStream()));
    13 
    14         // 封装文件目录
    15         BufferedWriter bw = new BufferedWriter(new FileWriter("TCP.txt"));
    16 
    17         // 把读取到的数据写入到文件中
    18         String line = null;
    19         while ((line = br.readLine()) != null) {
    20             bw.write(line);
    21             bw.newLine();
    22             bw.flush();
    23         }
    24 
    25         // 释放资源
    26         s.close();
    27         bw.close();
    28 
    29     }
    30 }

    2、客户端文本文件,服务器输出到控制台

      

      客户端代码:

     1 public class ClientDemo {
     2 
     3     public static void main(String[] args) throws IOException, IOException {
     4 
     5         // 创建socket传送对象
     6         Socket s = new Socket("172.19.12.233", 10010);
     7 
     8         // 封装文本文件,字符流读取里面的数据
     9         BufferedReader br = new BufferedReader(new FileReader("InetAddressDemo.java"));
    10         // 封装通道里的字节流为字符流
    11         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    12                 s.getOutputStream()));
    13 
    14         // 把读取到的数据输出到服务器端
    15         String line = null;
    16         while ((line = br.readLine()) != null) {
    17             bw.write(line);
    18             bw.newLine();
    19             bw.flush();
    20         }
    21         
    22         //释放资源
    23         s.close();
    24         br.close();
    25     }
    26 }

        服务器代码:

     1 public class ServerDemo {
     2     public static void main(String[] args) throws IOException {
     3 
     4         // 创建ServerSocket对象,监听
     5         ServerSocket ss = new ServerSocket(10010);
     6 
     7         // 创建socket对象
     8         Socket s = ss.accept();
     9 
    10         // 把通道中的字节流包装成字符流
    11         BufferedReader br = new BufferedReader(new InputStreamReader(
    12                 s.getInputStream()));
    13 
    14         // 接收客户端发来都数据
    15         String line = null;
    16         while ((line = br.readLine()) != null) {
    17             System.out.println(line);
    18         }
    19 
    20         //释放资源
    21         s.close();
    22 
    23     }
    24 }

    3、客户端读取文本文件,服务器输出文本文件

      (可用来上传文件)

    若是上传文件,那么我上传文件完毕后,客户端就要获得一个反馈。

    但是,只单单给服务器添加发送反馈,客户端添加接收反馈不行。

    因为:

      读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。

      所以,服务器根本就不知道读取结束了。而如果还想服务器给客户端反馈。所以,两者都在相互等待。

    如何解决呢?

       A:在多写一条数据,告诉服务器,读取到这条数据说明传输就结束,服务器的接收也结束吧。

        这样做可以解决问题,但是不好。因为你这个数据如果文件中刚好就存在,那么就提前结束了。

      B:Socket对象提供了一种解决方案

          public void shutdownOutput():

          禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。

      客户端的代码

     1 public class ClientDemo {
     2     public static void main(String[] args) throws IOException {
     3 
     4         // 创建Socket对象
     5         Socket s = new Socket("172.19.12.233", 10010);
     6 
     7         // 封装文件目录
     8         BufferedReader br = new BufferedReader(new FileReader(
     9                 "InetAddressDemo.java"));
    10 
    11         // 把通道内的字节流包装成字符流
    12         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    13                 s.getOutputStream()));
    14 
    15         // 获取文件中的数据,并输出给服务器
    16         String line = null;
    17         while ((line = br.readLine()) != null) {
    18 
    19             bw.write(line);
    20             bw.newLine();
    21             bw.flush();
    22         }
    23         
    24         //给服务器一个信号,上面的文本中的数据已经传递完毕
    25         s.shutdownOutput();
    26         
    27         // 接收反馈
    28         BufferedReader brr = new BufferedReader(new InputStreamReader(
    29                 s.getInputStream()));
    30 
    31         // 获取反馈,并输出到控制台
    32         String line1 = null;
    33         while ((line1 = brr.readLine()) != null) {
    34             System.out.println(line1);
    35         }
    36         
    37         brr.close();
    38         s.close();
    39         br.close();
    40 
    41     }
    42 }

      服务器的代码:

     1 public class ServerDemo {
     2     public static void main(String[] args) throws IOException {
     3 
     4         // 创建ServerSocket对象,监听
     5         ServerSocket ss = new ServerSocket(10010);
     6 
     7         // 创建socket对象
     8         Socket s = ss.accept();
     9 
    10         // 把通道内的字节流包装成字符流
    11         BufferedReader br = new BufferedReader(new InputStreamReader(
    12                 s.getInputStream()));
    13 
    14         // 封装文件目录
    15         BufferedWriter bw = new BufferedWriter(new FileWriter("TCPto.txt"));
    16 
    17         // 获取数据,并输出到文件中
    18         String line = null;
    19         while ((line = br.readLine()) != null) {
    20             bw.write(line);
    21             bw.newLine();
    22             bw.flush();
    23         }
    24 
    25         // 给出反馈
    26         BufferedWriter bwr = new BufferedWriter(new OutputStreamWriter(
    27                 s.getOutputStream()));
    28         bwr.write("你的文件上传成功!");
    29         bwr.newLine();
    30         bwr.flush();
    31         
    32         // 释放资源
    33         s.close();
    34         bw.close();
    35         bwr.close();
    36     }
    37 }
  • 相关阅读:
    WPF鼠标拖放功能(拖放图片,文本)
    PHP封装属性
    vs 启动时报错:未能加载文件或程序集 SharpGit
    C#.NET Winform承载WCF RESTful API (硬编码配置)
    使用edge浏览器时,怎么让alt+tab不切换他的子标签页而只在程序间切换?
    C#.NET Winform使用线程承载WCF (硬编码配置)
    AnkhSVN For Visual Studio 2022
    ASP.NET MVC 查询加分页
    C#.NET Winform承载WCF RESTful API (App.config 方式)
    C#.NET Windows服务承载WCF
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5965048.html
Copyright © 2011-2022 走看看