【问题标题】:Sending a Keep-Alive packet manually using sockets使用套接字手动发送 Keep-Alive 数据包
【发布时间】:2011-08-10 20:57:39
【问题描述】:

我有一个名为“clientSock”的套接字。它已连接并正常工作。

我在线程中使用循环接收数据,如下:

char[] inputChars = new char[1024];
int charsRead = 0;

    while (!stopNow) {

        try {

            if ((charsRead =  inputStream.read(inputChars)) != -1)
                {

                    System.out.println("Firing");
                    fire_dataRecieved(new String(inputChars, 0, charsRead)); //Fire event.
                }

            } catch (IOException e) {
                //CLIENT HAS DISCONNECTED...
                connectedClient.disconnect();
                stopNow();
            }
        }

我正在考虑通过简单地向另一端发送“#KEEP-ALIVE”来发送“保持活动数据包”。

我可以使用sendStream.print("#KEEP-ALIVE") 来做到这一点。有没有更好的方法来做到这一点?如果没有,是否有一种有效的方法来检查您是否收到了数据包?或者已经存在可以让您检查另一端是否还活着的东西? clientSock.setKeepAlive(true) 不适合我。我需要根据需要检查另一端是否处于活动状态。

【问题讨论】:

  • 一种选择是在客户端套接字上set a read timeout
  • 你在使用linux吗?在 linux 中,默认保持活动时间为 2 小时
  • “手动”和“按需”表示我想随时随地发送保持活动状态,而不是每两个小时发送一次。

标签: java sockets networking keep-alive


【解决方案1】:

有没有更好的方法来做到这一点? 如果没有,有没有有效的方法 检查你是否收到了数据包?或者 已经存在的东西允许 你检查另一端是否是 还活着吗?

如果连接出现问题,当您发送自己的保持活动数据包时,TCP 堆栈会很快告诉您。它包含一个方法来检查数据包是否以正确的顺序到达。

现在,如果您想要明确确认您的数据包已收到,您应该让另一端发回确认信息。恕我直言,这是矫枉过正,但这是你必须做的。

如果您在合理的延迟(10 秒绰绰有余)内没有得到响应,并且 TCP 堆栈没有抛出某种错误,则意味着另一端的侦听方/应用程序没有执行它工作。问题出在应用程序级别,而不是 TCP 堆栈级别。

【讨论】:

  • 很好的答案。我知道 TCP 堆栈应该处理它,但我也想 100% 确定应用程序层正在做它的工作。
【解决方案2】:

我不确定您的问题是什么。
如果另一端在网络级别出现故障,您将在尝试从输入流中读取时遇到异常。
如果另一端有端口绑定,但应用程序级别存在问题导致应用程序无法响应,则可以使用 JVestry 提到的ACK
除非您的问题是您需要区分间歇性网络故障和服务器应用离线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2013-07-04
    • 2016-09-07
    • 2013-05-08
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多