如何处理client socket关闭之后的readLine异常?
来源:5-12 多人聊天室演示(下)

慕粉3458977
2020-06-27
receive()会阻塞在readLine()这一行接收消息,如果client发送quit退出的同时,调用了socket.close(),那么readLine()会抛异常,怎样避免呢,或者怎样优雅的处理呢?
public String receive() throws IOException {
String message = null;
if (!this.socket.isInputShutdown()) {
message = this.reader.readLine();
}
return message;
}
quit
java.net.SocketException: Socket closed
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:183)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
写回答
1回答
-
Stannum
2020-08-07
同学好~你这个问题提的很好,说明你用心的研究过课程代码了~在我们这个例子里,一个常见的做法是让UserInputHandler和ChatClient线程之间沟通用户是否退出聊天这个信息,以此来避免在Socket关闭之后继续读取数据而抛出异常。
我建议你自己按照这个思路先试着实现一下。在课程后续的更新中,我们也计划带着大家一起持续的优化课程项目~
00
相似问题