当前位置: 首页 > 知识库问答 >
问题:

使用TCP KeepAlive检测套接字断开

陆耀
2023-03-14

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

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

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();
        }
    }
}

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

共有1个答案

柴博
2023-03-14

对于TCP堆栈的内置保留活版,您不会有太大的进展。这是因为keep-alive间隔不能由应用程序调优,它是由操作系统设置的,并且默认值相当高(小时)。这并不是Java特有的。

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

 类似资料:
  • 我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。 我将clientNo 1连接到服务器,它接收 客户1 但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将

  • 问题内容: 我正在使用OpenShift和WildFly 8.2.1 final来实现新的HTML5 websocket。我使用了本教程来设置这个项目。 每当我打开MyTest.html时,这就是JavaScript记录的内容: 服务器连接,然后立即断开连接。为什么?我究竟做错了什么?有什么我想念的吗? 这是模式代码-> serverendpoint.java MyTest.html: 和pom.

  • 套接字接口 结构体 struct   fd_set   文件句柄管理 更多...   类型定义 typedef struct fd_set  fd_set   文件句柄管理   函数 int  socket (int domain, int type, int protocol)   创建套接字   int  bind (int s, const struct sockaddr *name, so

  • 问题内容: 检测插座是否已掉落的最合适方法是什么?还是实际上是否发送过数据包? 我有一个库,用于通过Apple网关(在GitHub上提供)将Apple Push Notifications发送到iPhone 。客户端需要打开一个套接字并发送每个消息的二进制表示形式。但不幸的是,Apple不会返回任何确认。该连接也可以重用于发送多个消息。我正在使用简单的Java套接字连接。相关代码为: 在某些情况下

  • 问题内容: 我正在调试基于ac的linux socket程序。作为网站上所有可用的示例,我应用了以下结构: 当删除服务器关闭其服务器程序时,我可以检测到断开连接。但是,如果拔下以太网电缆,则send函数仍然返回正值,而不是-1。 假设无法更改服务器端,如何在客户端程序中检查网络连接? 问题答案: 但是,如果拔下以太网电缆,则send函数仍然返回正值,而不是-1。 首先,您应该知道实际上并没有发送任

  • 问题内容: 我正在开发网络应用程序,我想正确进行单元测试。这次我们会做的,你知道吗?:) 我在测试网络连接时遇到了麻烦。 在我的应用程序中,我使用plain 。 例如: 我读过有关模拟的内容,但不确定如何应用。 问题答案: 如果要测试代码,请执行以下操作。 首先,重构代码,以便不会在要测试的方法中直接实例化。下面的示例显示了我可以想到的最小更改。将来的更改可能会将创建过程排除在一个完全独立的类之外