我在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类中的资源块相同的尝试
答案 0 :(得分:2)
如果客户端不清楚地关闭TCP套接字而没有发送显式FIN(例如,如果客户端崩溃),那么服务器将不知道它,直到它下次尝试向客户端发送数据包(此时客户端)将发送一个RST数据包告诉服务器套接字已关闭。
假设您已控制客户端和服务器代码,检查连接的最可靠方法是在两者之间实现心跳机制,以便他们定期ping它们之间的一小段数据以检查连接的有效性
答案 1 :(得分:0)
Keep alive socket选项是观看持久TCP连接的标准方法。 如果您的服务器在中止期间处于阻塞读取操作中,您将获得java.io.IOException:读取失败。在异步情况下,您将收到带有-1的读取密钥。 在写入状态中,您将获得:通过对等方重置连接:套接字写入错误。 如果连接不可恢复,只需处理异常或错误代码即可关闭线程。