我想知道在客户端检查使用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);
}
}
});
也不会抛出异常。
所以在这一点上,即使客户端定期向其发送数据,我也不确定如何检测套接字不再可用。
答案 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)
{
}
});