如何使用Koush AndroidAsync关闭/重试/管理WebSocket?

7
我正在使用Koush的AndroidAsync作为WebSocket客户端。我的代码遵循https://github.com/koush/AndroidAsync上的示例,并且可以正常工作。(以下是示例代码)
我需要在应用程序启动时打开一个WebSocket,但是我需要处理一些问题:
A)我需要允许用户更改WebSocket服务器的地址。在这种情况下,我需要关闭现有的WebSocket(可能失败),并打开到新服务器的WebSocket。
B)服务器可能停机或不可用。在这种情况下,我想将其报告给活动。目前它只是悄悄地失败了。
所以按重要性顺序:
1.如何关闭WebSocket?
2.如何高效地打开到新地址的WebSocket?(我可以重用我的AsyncHttpClient吗?)
3.如何在连接失败或丢失时重试?
4.如何提供连接失败/关闭的通知?
如果此处有文档,请告诉我。
以下是从网站复制的示例代码:
AsyncHttpClient.getDefaultInstance().websocket(get,"my-protocol",new WebSocketConnectCallback(){
    @Override
    public void onCompleted(Exception ex,WebSocket webSocket){
        if(ex!=null){
            ex.printStackTrace();
            return;
        }
        webSocket.send("a string");
        webSocket.send(new byte[10]);
        webSocket.setStringCallback(new StringCallback(){
            public void onStringAvailable(String s){
                System.out.println("I got a string: "+s);
            }
        });
        webSocket.setDataCallback(new DataCallback(){
            public void onDataAvailable(ByteBufferList byteBufferList){
                System.out.println("I got some bytes!");
                // note that this data has been read
                byteBufferList.recycle();
            }
        });
    }
});
1个回答

5

我阅读了 AndroidAsync 的源代码。

如何关闭连接

WebSocket 接口继承自 DataEmitter 接口的 close() 方法。 调用 close() 方法会关闭 WebSocket 连接,但需要注意的是, 实现(WebSocketImpl.close())没有执行 关闭握手, 而这是 RFC 6455 所要求的。

此外,当 WebSocketImpl 收到一个 关闭帧 后, onDisconnect() 方法会关闭底层套接字,但不执行关闭握手。

因此,在任何情况下,都不会执行关闭握手。但如果您不介意服务器端的错误日志,那么这不是一个严重的问题。

如何重试和提供通知

您可以通过使用 setClosedCallback() 方法和 setEndCallback() 方法设置回调来检测断开连接,但我不确定。

如何重试和提供通知取决于您。在检测到断开连接后,您可以按照自己的意愿进行操作。

推荐

如果您想接收 WebSocket 上发生的细粒度事件,并想了解有关错误的详细信息, 请尝试 nv-websocket-client。 它的监听器接口 有许多回调入口点,并定义了细粒度的 错误代码。 新的 WebSocket 客户端库正确执行 关闭握手


你能提供一个如何从WebSocketConnectCallback之外调用close()的例子吗?我不清楚如何修改示例代码以执行关闭操作。例如,如果我定义了mWebSocketConnectCallback = new WebScokectConectCallback() {...}; mAsyncHttpClient = AsyncHttpClient.getDefaultInstance(); mAsyncHttpClient.websocket(mHostAddress, null, mWebSocketConnectCallback); 我可以使用mAsyncHttpClient来关闭连接吗? - proximous
1
我没有尝试过,但是这样行吗?Future<WebSocket> f = AsyncHttpClient.getDefaultInstance().websocket(...); WebSocket ws = f.get(); ws.close(); - Takahiko Kawasaki
这对于关闭WS是有效的。我仍然需要查看setClosedCallback()和setEndCallback()来真正管理连接。我还将查看nv-websocket-client,因为管理我的连接非常关键,所以我会看看该库是否提供了一种简单的方法来实现这一点。我真的需要一种简单但高度可靠的方式来创建、关闭和维护不稳定网络链接上的websocket。谢谢! - proximous
我认为你的库非常易于使用和维护。我正在寻找与同样问题相关的信息。 - March3April4
同意@March3April4的看法。 Takahiko的库更易于实现,并且处理WebSocket断开连接更好。 它还使回调函数的实现更容易。我建议迁移库而不是尝试绕过它。我花了大约一个小时来排除故障并弄清楚如何修复它,但只用了5分钟就迁移到了Takahiko的库。 - velval

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接