进天遇到一个Sokcet问题,以下是有问题的代码
客户端:
public class SocketClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("127.0.0.1",11224);
OutputStream out = s.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
writer.println(""+"发出请求消息\r\n");
writer.flush();
InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while((line=reader.readLine())!=null){
System.out.println("SocketClient"+line);
}
writer.close();
reader.close();
s.close();
System.out.println("over");
}
}
服务端:
public class SocketServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(11224);
Socket s = null;
while(true){
s = ss.accept();
InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while((line = reader.readLine())!=null){
System.out.println("SocketServer:"+line);
}
// line = reader.readLine();
// System.out.println("SocketServer:"+line);
// System.out.println(reader.readLine());
OutputStream out = s.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
writer.println("收到信息\r\n");
writer.flush();
writer.close();
reader.close();
}
}
}
分别运行服务端和客户端,程序会在服务端循环调用reader.readLine();处阻塞,从而客户端得不到响应。 但是当去掉循只运行一次reader.readLine()方法让服务端正常响应,在客户端的循环readLine()方法却并未阻塞 而是在读完响应后正常返回了null。
经过总结服务端跳出读取数据的循环有两种方法:1.在客户端发送的请求数据中写上报文长度,服务端根据长度解析报文。2.客户端发送的请求报文结束后与服务端约定一个结束标志,服务端独到结束标志,结束读取数据。
但是客户端却可以用reader.readLine()!=null来作为读取数据的结束的判断条件。
为什么会是这样呢?待以后再追究原因,今天先用结论。
找着原因了,客户端之所有readLine.readLine()没有阻塞是因为服务端writer.close()把服务端输出流给关掉了,这时服务端socket就任务流结束了于是返回readLine.readLine()=null。由此可见已readLine.readLine()=null条件做跳出读取数据的判断不使用与服务端但使用与客户端,前提是服务端输出完毕后把流关了。
![](https://i-blog.csdnimg.cn/blog_migrate/5c36cecacd0d7008c496aa4dae939df2.png)