【发布时间】:2013-11-16 04:10:17
【问题描述】:
我正在开发一个服务器,该服务器通过 TCP/IP 托管第 3 方设备,并且遇到了突然的连接中断(设备通过蜂窝网络连接)。我需要找到一种方法来检测断开连接,而无需将数据写入设备本身。
我已经研究过如何使用 TCP keepalive 功能,但 Java 似乎不允许对 keepalive 操作的时间进行任何调整。
有什么建议的方法吗?
我的简化套接字代码如下:
public class Test2Socket {
public static void main(String[] args) {
try {
ServerSocket skt = new ServerSocket(1111);
Socket clientSocket = skt.accept();
clientSocket.setKeepAlive(true);
System.out.println("Connected..");
BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while((inputLine = input.readLine()) != null)
{
System.out.println(inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
任何反馈都将不胜感激。
【问题讨论】:
-
为什么不能向客户端写入数据? keepalive 间隔通常固定为 2 小时,因此无法快速检测掉线。
-
我试过这样做。该设备只是向我抛出了一个错误,并且有点嘶嘶作响。
-
看看我的案例和解决方案stackoverflow.com/a/31741436/413032
-
壮观的是,错误的答案是最受投票和接受的解决方案。对我来说很明显,检测 Socket 超时/网络断开是 TCP 存在的主要原因。这方面不应该在应用程序级别处理,它应该发送 NOP。 TCP 已经发送了 SYN/ACK 数据包。
标签: java multithreading sockets tcp ip