使用套接字手动发送Keep-Alive数据包

时间:2011-06-13 11:56:58

标签: java sockets networking keep-alive

我有一个名为“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)并没有为我削减它。我需要根据需要检查另一端是否还活着。

2 个答案:

答案 0 :(得分:1)

  

有更好的方法吗?   如果没有,是否有一种有效的方式   检查你是否收到了包裹?要么   已有的东西允许   你要检查另一端是否   活着?

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

现在,如果您想明确确认收到了您的数据包,您应该让另一端发回确认信息。恕我直言,但这就是你需要做的事情。

如果你没有在合理的延迟内得到响应(10秒就足够了),并且如果TCP堆栈没有引发某种错误,则意味着另一方的监听方/应用程序没有执行工作。问题出在应用程序级别,而不是TCP堆栈级别。

答案 1 :(得分:1)

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