最近在编写一个小小的Socket通信小程序,由于对Socket比较生疏,所以写了个小程序练练。
小程序实现的功能如下:
1.客户端发送一则消息到服务端;
2.服务端接收到消息后,把客户端发过来的消息返回;
3.客户端接收服务端反馈的消息;
问题:
服务端处于阻塞状态下,一直read无法读取完;
服务端程序代码如下:
package com.ftp.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class FtpClient {
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
for (int i = 0; i < 10; i++) {
Socket socket = new Socket("localhost",9999);
InputStream in = socket.getInputStream();
PrintWriter out = new PrintWriter(socket.getOutputStream());
String msg = "Hello Michael,Id is "+i+".";
System.out.println("<-"+msg);
out.println(msg);
out.flush();
socket.shutdownOutput();//红色标记
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String str = null;
while((str = reader.readLine()) != null){
System.out.println("->"+str);
}
socket.shutdownInput();
socket.close();
}
}
}
然后先启动服务端,再启动客户端,假如去掉红色注解部分,服务端会出现一直等待读取状态...
经查阅TCP相关文档后,得知问题出错关键,(小弟知识浅薄啊,菜);
TCP连接后,服务器会一直等待客户发送信息的是否完成标记,客户端未传送完成消息,服务端又怎知你已经消息全部发送无呢?
所以标红色部分就相当于告诉服务端,客户端已经把数据传送完毕,服务端可以进行下一步操作;