ServerSocket serverSocket = new ServerSocket(portNumber)
Socket socket = serverSocket.accept();
try (
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
) {
while (in.readLine() != null) {
//do something
}
System.out.println("reach me if you can");
socket.close();
}
编写我的服务器/客户端软件,我尝试实现显示当前连接数的功能。但我意识到当客户端突然终止时,我的服务器永远不会收到消息;它只是在in.readLine()
等待。我应该如何确保在连接断开时,为处理特定连接而创建的Thread
是否仍未运行?
答案 0 :(得分:1)
一般的TCP问题是,连接一端的机器可能会在没有通知另一端机器的情况下消失。机器不是假设这样做,但它并不总是在他们的控制之下。在这种情况下,一端避免永远等待数据和/或避免使用死连接加载的通常方法是使用超时。
一般问题比你描述的要大,但你应该能够在尝试读取套接字之前的某个时候通过在套接字上调用setSoTimeout()
来解决你所询问的特定部分。如果读取尝试阻塞的时间超过指定的时间,则套接字将抛出异常。此设置在套接字的生命周期内持续存在(或直到您设置不同的值),因此如果您愿意,可以在接受连接后立即应用它。
但请注意,足够长时间的简单客户端不活动也会导致超时。