我有一个简单的服务器,它接受来自客户端的 TCP 套接字连接。每个尝试连接的客户端都会使用新的 Socket 获取自己的 TCPConnectionHandler
实例。我不明白应该如何处理客户端断开连接。这是我的 TCPConnectionHandler
:
@Override
public void run() {
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line;
while (!(line = br.readLine()).isEmpty()) {
Message messageObj = Tools.JSON2Message(line);
messageObj.setSourceIP(socket.getInetAddress().toString().substring(1));
logger.info("TCPCH: Message received from: " + messageObj.getSourceIP() + ". Type of message: " + messageObj.getClass().getSimpleName());
Message response;
if (messageObj instanceof HandshakeReq) {
response = new HandshakeHandler(requestRouter.getTabletCollection()).handleRequest((HandshakeReq) messageObj, this);
} else {
response = requestRouter.routeAndHandleRequest(messageObj);
}
if (response != null)
sendMessageTCP(response);
}
} catch (IOException e) {
logger.error("TCPConnectionHandler failed: " + e.getCause());
e.printStackTrace();
}
}
现在,当客户端断开连接时,我会得到 NullPointerException
,它可以追溯到 run()
方法。一开始,我认为它是从 Socket
对象获取的 InputStream
,当客户端断开连接时,它会变为 null
并且我得到 NullPointerException
当 BufferedReader
调用 readLine()
时。但我无法捕捉到这个异常。当客户端断开连接时实际会发生什么以及我应该如何正确捕获与上述代码片段相关的情况?
最佳答案
您的循环条件错误。如果客户端断开连接,readLine()
将返回 null,,而不是空字符串。因此,您当前的循环将抛出 NullPointerException
而不是干净地退出。
此外,只需在 try block 中添加更多 catch 阶段即可。
catch (NullPointerException ex) {
socket.close()
}
那么一切都会好起来的。
关于java - 处理 TCP 客户端断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000871/