• 周日. 10 月 6th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

java 26

admin

11 月 28, 2021

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 }

发表回复