java - 处理 TCP 客户端断开连接

标签 java sockets tcp

我有一个简单的服务器,它接受来自客户端的 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 并且我得到 NullPointerExceptionBufferedReader 调用 readLine() 时。但我无法捕捉到这个异常。当客户端断开连接时实际会发生什么以及我应该如何正确捕获与上述代码片段相关的情况?

最佳答案

您的循环条件错误。如果客户端断开连接,readLine() 将返回 null,,而不是空字符串。因此,您当前的循环将抛出 NullPointerException 而不是干净地退出。

此外,只需在 try block 中添加更多 catch 阶段即可。

catch (NullPointerException ex) {
    socket.close() 
}

那么一切都会好起来的。

关于java - 处理 TCP 客户端断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000871/

相关文章:

java - spring-data-rest,你能提供实体的完整细节而不是(或与)链接吗

python - 如何知道python中tcp connect的状态?

c - gethostbyname() 函数返回空缓冲区

c++ - 如果我想制作分布式互斥库,我是否必须创建一个线程?

http - 谁负责 OSI 中的表示层和 session 层?

c - 处理 TCP PSH

java - 使用 hbase API 获取区域名称的正确方法

java - JSON 映射到 Java 返回空值

java - 需要使用Java自动连接到ssh

c - 修改c socket程序从服务器向客户端发送文件