Socket编程小错误

  • 格式:docx
  • 大小:16.16 KB
  • 文档页数:2

最近在编写一个小小的Socket通信小程序,由于对Socket比较生疏,所以写了个小程序
练练。

小程序实现的功能如下:
1.客户端发送一则消息到服务端;
2.服务端接收到消息后,把客户端发过来的消息返回;
3.客户端接收服务端反馈的消息;
问题:
服务端处于阻塞状态下,一直read无法读取完;

服务端程序代码如下:
[java] view plaincopy
1. package com.ftp.client;
2.
3. import java.io.BufferedReader;
4. import java.io.IOException;
5. import java.io.InputStream;
6. import java.io.InputStreamReader;
7. import java.io.PrintWriter;
8. import java.net.Socket;
9. import java.net.UnknownHostException;
10.
11. public class FtpClient {
12. public static void main(String[] args) throws UnknownHostException, IOEx
ception, InterruptedException {
13.
14. for (int i = 0; i < 10; i++) {
15. Socket socket = new Socket("localhost",9999);
16. InputStream in = socket.getInputStream();
17. PrintWriter out = new PrintWriter(socket.getOutputStream());
18. String msg = "Hello Michael,Id is "+i+".";
19. System.out.println("<-"+msg);
20. out.println(msg);
21. out.flush();
22. socket.shutdownOutput();//红色标记
23.
24. BufferedReader reader = new BufferedReader(new InputStreamReader
(in));
25. String str = null;
26. while((str = reader.readLine()) != null){
27. System.out.println("->"+str);
28. }
29. socket.shutdownInput();
30. socket.close();
31. }
32.
33. }
34. }

然后先启动服务端,再启动客户端,假如去掉红色注解部分,服务端会出现一直等待读取状
态...

经查阅TCP相关文档后,得知问题出错关键,
TCP连接后,服务器会一直等待客户发送信息的是否完成标记,客户端未传送完成消息,
服务端又怎知你已经消息全部发送无呢?

所以标红色部分就相当于告诉服务端,客户端已经把数据传送完毕,服务端可以进行下一步
操作;