首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用TCP KeepAlive检测套接字断开

用TCP KeepAlive检测套接字断开
EN

Stack Overflow用户
提问于 2013-11-05 10:09:56
回答 5查看 24.5K关注 0票数 10

我正在开发一个服务器,它通过TCP/IP承载第三方设备,并且经历了突然的连接下降(设备通过蜂窝连接)。我需要找到一种方法来检测断开,而不必将数据写入设备本身。

我已经看过如何使用TCP保活功能,但Java似乎不允许任何时间调整保持活动操作的时间。

有没有建议的方法来做这件事?

我的简化套接字代码如下:

代码语言:javascript
复制
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();
        }
    }
}

如有任何反馈,将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-05 10:36:21

您将不会对TCP堆栈的内置保存生命有太大的了解。这是因为应用程序无法对“保持活动”间隔进行调优,它是由操作系统设置的,缺省值相当高(小时)。这并不是Java特有的。

如果您需要在合理的时间内超时,则必须在要使用的协议中实现某种保持活动的状态。我见过的大多数高级协议都有某种NOP功能,您可以发送一个“您在吗?”信息和对方发送了一个“是的,我在这里”的回复,没有做任何其他事情。

票数 8
EN

Stack Overflow用户

发布于 2015-11-25 23:19:19

有关TCP保持生命的深入讨论,请参见我的答案这里

但基本上,TCP保持生命很可能是检测陈旧连接的最佳方法。主要的问题是,在连接被检查之前,操作系统默认设置为2小时,在实际丢弃连接之前,再用11分钟保持活跃的数据包。

当TCP已经内置时,不要编写自己的应用层保持活动协议。你所要做的就是做一些更合理的事情,比如2-3分钟.

不幸的是,由于TCP超时是在操作系统级别而不是在JVM中管理的,因此很难(但不是不可能)在代码中根据每个套接字配置TCP超时。

票数 4
EN

Stack Overflow用户

发布于 2013-11-05 22:00:12

使用setSoTimeout(),将读取超时设置为合理的值,比方说是预期响应时间的两倍,并捕获结果的SocketTimeoutException.

不存在"Java“这样的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19786394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档