2011-06-13 37 views
4

我有一个名为“clientSock”的套接字。它已连接并正在工作。使用套接字手动发送Keep-Alive包

我收到使用一个线程循环的数据,如下所示:

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

我想发送的“保持活动包”,只需发送“#保活”到另一端。

我可以使用sendStream.print("#KEEP-ALIVE")来做到这一点。有没有更好的方法来做到这一点?如果没有,是否有一种有效的方法来检查你是否得到了数据包?或者已经有的东西可以让你检查另一端是否还活着? clientSock.setKeepAlive(true)不会为我剪下它。我需要检查另一端是否按需提供。

+0

一个选项是在客户端套接字上设置读取超时(http://download.oracle.com/javase/6/docs/api/java/net/Socket.html#setSoTimeout%28int%29) 。你使用'linux'是否是 – mre 2011-06-13 12:00:23

+0

?在Linux中,默认保持活动时间是** 2小时**。 – 2011-06-13 12:19:11

+0

“手动”和“按需”意味着我想发送保持活力*只要我想*,而不是每两个小时。 – David 2011-06-13 12:39:33

回答

1

有没有更好的方法来做到这一点? 如果不是, 是否有效的方式检查你是否得到了数据包?或 东西已经存在,允许您检查 是否存在 ?

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

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

如果你没有在合理的延迟时间内得到响应(10秒以上),并且如果TCP堆栈没有抛出某种错误,这意味着另一方的聆听方/应用程序没有做它的工作。问题出现在应用程序级别,而不是TCP堆栈级别。

+1

非常好的答案。我知道TCP栈应该处理它,但我也希望100%确定应用程序层正在完成它的工作。 – David 2011-06-13 14:02:28

1

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