2016-03-28 21 views
0

我想知道在客户端检查使用AndroidAsync库打开的TCP套接字不再可用的正确方法是什么?这是(纯TCP,非AndroidAsync)服务器不启动显式关闭套接字(因此不调用ClosedCallback)。例如,当服务器已经冷启动。AndroidAsync TCP - 使用写入功能检测套接字的正确方法不再可用?

似乎DataCallback仅在服务器发回数据并且不能用于接收错误消息时才可用。

在我看来也是

Util.writeAll(socket, (byte[]) payload.array(), new CompletedCallback() 
    { 
     @Override 
     public void onCompleted(Exception ex) 
     { 
      if (ex != null) 
      { 
       Log.e(TAG, "write failed with ex message= " + ex.getMessage()); 
       throw new RuntimeException(ex); 
      } 
     } 
    }); 

不要么抛出异常。

所以在这一点上,我不知道如何检测套接字已不再可用,即使客户端定期向其写入数据。

回答

-1

你可以使用封闭/结束回调

socket.setClosedCallback(new CompletedCallback() 
{ 
      @Override 
      public void onCompleted(Exception ex) 
      { 

      } 
     }); 

socket.setEndCallback(new CompletedCallback() 
{ 
      @Override 
      public void onCompleted(Exception ex) 
      { 

      } 
}); 
+0

不幸的是,服务器不是一个AndroidAsync服务器,不会关闭连接,以便可以调用回调。 – Objectist

+0

对不起,你是什么意思的非AndroidAsync服务器? 即使使用node.js,甚至是自定义的C++ tcp服务器,当服务器死亡时,我仍然可以在客户端上得到最终和关闭的回调,我认为它与AndroidAsync没有任何关系,它更像是一个tcp标准 – behelit

+0

在我的环境中,除了关闭服务器(正常)之外,还有其他用例,当连接从客户端和服务器的角度来看都不再有效时。由于服务器不是由我实施/控制的AndroidAsync服务器,必须纯粹在客户端发现。 – Objectist

0

它会抛出一个IOexception如果您发送足够的数据或调用它足够的时间。由于两端的TCP缓冲,它不会抛出第一个呼叫。

+0

这是有道理的。但是,客户端是具有可视化前端的服务器的远程控制器。当“足够”的数据/呼叫被发送时,两者将长时间不同步,导致不良的用户体验。 – Objectist

0

我最终实施了某种类似“ping”的定期检查。客户端打开并立即使用普通Java NIO套接字调用(不使用AndroidAsync)关闭到同一端口的TCP连接。如果这一次超时,则认为连接已经丢失,并且一旦它再次成功就进行恢复尝试。此定期检查仅在应用程序有焦点或刚被唤醒时执行。这显然是一个远非理想的解决方法,但它似乎适用于我的目的。