AndroidAsync TCP - 使用write不再提供检测套接字的正确方法吗?

时间:2016-03-28 07:41:40

标签: sockets tcp androidasync-koush

我想知道在客户端检查使用AndroidAsync库打开的TCP套接字不再可用的正确方法是什么?这是(普通TCP,非AndroidAsync)服务器未启动显式关闭套接字的情况(因此不调用ClosedCallback)。例如,当服务器冷启动时。

似乎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);
            }
        }
    });

也不会抛出异常。

所以在这一点上,即使客户端定期向其发送数据,我也不确定如何检测套接字不再可用。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

您可以使用关闭/结束回调

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

            }
        });

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

            }
 });