0

我想知道在客户端检查使用 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);
            }
        }
    });

也不抛出异常。

所以此时我不确定如何检测套接字不再可用,即使客户端定期向其写入数据。

4

3 回答 3

0

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

于 2016-05-24T20:13:15.350 回答
0

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

于 2016-05-11T00:24:45.593 回答
-1

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

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

            }
        });

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

            }
 });
于 2016-05-11T00:22:19.640 回答