客户端关闭TCP连接时中断服务器线程

时间:2015-01-12 11:29:57

标签: java multithreading sockets tcp server

我在Java中有一个多线程TCP服务器,允许来自多个客户端的连接,并为每个连接的客户端启动一个新的ServerThread:

服务器类:

while (!Thread.currentThread().isInterrupted()) {
    try {
        // Create a new thread for each incoming connection.
        Socket clientSocket = serverSocket.accept();
        ServerThread serverThread = new ServerThread(clientSocket, this);
        serverThread.run();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在特定超时后,客户端关闭其套接字。如何中断与客户端连接的ServerThread? <{1}}和clientsocket.isClosed()由于某种原因无效。

最后,我使用了以下代码片段(解决方案是资源块中的套接字和无尽的!clientSocket.isConnected()):

服务器类

in.readLine() == null

ServerThread类:

public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        try {
            // Create a new thread for each incoming connection.
            Socket clientSocket = serverSocket.accept();
            ServerThread serverThread = new ServerThread(clientSocket, this);
            serverThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端类:我使用与ServerThread类中的资源块相同的尝试

2 个答案:

答案 0 :(得分:2)

如果客户端不清楚地关闭TCP套接字而没有发送显式FIN(例如,如果客户端崩溃),那么服务器将不知道它,直到它下次尝试向客户端发送数据包(此时客户端)将发送一个RST数据包告诉服务器套接字已关闭。

假设您已控制客户端和服务器代码,检查连接的最可靠方法是在两者之间实现心跳机制,以便他们定期ping它们之间的一小段数据以检查连接的有效性

答案 1 :(得分:0)

Keep alive socket选项是观看持久TCP连接的标准方法。 如果您的服务器在中止期间处于阻塞读取操作中,您将获得java.io.IOException:读取失败。在异步情况下,您将收到带有-1的读取密钥。 在写入状态中,您将获得:通过对等方重置连接:套接字写入错误。 如果连接不可恢复,只需处理异常或错误代码即可关闭线程。