我正在开发一个服务器,它通过TCP/IP承载第三方设备,并且经历了突然的连接下降(设备通过蜂窝连接)。我需要找到一种方法来检测断开,而不必将数据写入设备本身。
我已经看过如何使用TCP保活功能,但Java似乎不允许任何时间调整保持活动操作的时间。
有没有建议的方法来做这件事?
我的简化套接字代码如下:
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();
}
}
}如有任何反馈,将不胜感激。
发布于 2013-11-05 10:36:21
您将不会对TCP堆栈的内置保存生命有太大的了解。这是因为应用程序无法对“保持活动”间隔进行调优,它是由操作系统设置的,缺省值相当高(小时)。这并不是Java特有的。
如果您需要在合理的时间内超时,则必须在要使用的协议中实现某种保持活动的状态。我见过的大多数高级协议都有某种NOP功能,您可以发送一个“您在吗?”信息和对方发送了一个“是的,我在这里”的回复,没有做任何其他事情。
发布于 2015-11-25 23:19:19
有关TCP保持生命的深入讨论,请参见我的答案这里。
但基本上,TCP保持生命很可能是检测陈旧连接的最佳方法。主要的问题是,在连接被检查之前,操作系统默认设置为2小时,在实际丢弃连接之前,再用11分钟保持活跃的数据包。
当TCP已经内置时,不要编写自己的应用层保持活动协议。你所要做的就是做一些更合理的事情,比如2-3分钟.
不幸的是,由于TCP超时是在操作系统级别而不是在JVM中管理的,因此很难(但不是不可能)在代码中根据每个套接字配置TCP超时。
发布于 2013-11-05 22:00:12
使用setSoTimeout(),将读取超时设置为合理的值,比方说是预期响应时间的两倍,并捕获结果的SocketTimeoutException.
不存在"Java“这样的东西。
https://stackoverflow.com/questions/19786394
复制相似问题