如何处理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关闭之后继续读取数据而抛出异常。

我建议你自己按照这个思路先试着实现一下。在课程后续的更新中,我们也计划带着大家一起持续的优化课程项目~

0
0

系统学习Java网络编程 深度理解BIO/NIO/AIO

对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。

880 学习 · 148 问题

查看课程