如何 close/retry/manage 使用 Koush AndroidAsync 的 WebSocket?
How to close/retry/manage a WebSocket using Koush AndroidAsync?
我将 Koush 的 AndroidAsync 用于 WebSocket 客户端。我的代码遵循 https://github.com/koush/AndroidAsync 中的示例并且有效。 (下面复制的示例。)
我需要我的应用在启动时打开一个 websocket,但是,我需要处理几个问题:
A) 我需要允许用户更改 websocket 服务器的地址。在这种情况下,我需要关闭现有的 websocket(可能已经失败)并打开一个到新服务器的 websocket。
B) 服务器可能已关闭或不可用。在这种情况下,我想向 activity 报告。目前它只是默默地失败了。
所以按重要性排序:
- 如何关闭 websocket?
- 如何有效地打开一个新地址的 websocket? (我可以重复使用我的 AsyncHttpClient 吗?)
- 如何重试连接失败或丢失的连接?
- 如何提供连接 failed/closed 的通知?
如果某处记录了这一点,请告诉我。
示例代码来自下面复制的网站:
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();
}
});
}
});
我阅读了AndroidAsync的源代码。
如何关闭
WebSocket
接口从DataEmitter
接口继承close()
方法。
调用 close()
方法会关闭 WebSocket 连接,但要注意
实现 (WebSocketImpl.close()
) 不执行
closing handshake 这是
RFC 6455.
要求
此外,onDisconnect()
in WebSocketImpl
关闭底层套接字
当它收到一个
close frame.
因此,无论如何,不会执行关闭握手。但是,这不是
如果您不介意服务器端的错误日志,这是一个严重的问题。
如何重试以及如何提供通知
您可以通过设置回调来检测断开连接
setClosedCallback()
方法和 setEndCallback()
方法,但我不确定。
如何重试以及如何提供通知由您决定。你可以做
检测到断线后随心所欲。
推荐
如果您想接收发生在 WebSocket 上的细粒度事件并且
想知道有关错误的详细信息,
尝试 nv-websocket-client。
它的 listener interface
有很多回调入口点,它定义了细粒度的
error codes。
新的 WebSocket 客户端库执行
closing handshake正确。
我将 Koush 的 AndroidAsync 用于 WebSocket 客户端。我的代码遵循 https://github.com/koush/AndroidAsync 中的示例并且有效。 (下面复制的示例。)
我需要我的应用在启动时打开一个 websocket,但是,我需要处理几个问题:
A) 我需要允许用户更改 websocket 服务器的地址。在这种情况下,我需要关闭现有的 websocket(可能已经失败)并打开一个到新服务器的 websocket。
B) 服务器可能已关闭或不可用。在这种情况下,我想向 activity 报告。目前它只是默默地失败了。
所以按重要性排序:
- 如何关闭 websocket?
- 如何有效地打开一个新地址的 websocket? (我可以重复使用我的 AsyncHttpClient 吗?)
- 如何重试连接失败或丢失的连接?
- 如何提供连接 failed/closed 的通知?
如果某处记录了这一点,请告诉我。
示例代码来自下面复制的网站:
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();
}
});
}
});
我阅读了AndroidAsync的源代码。
如何关闭
WebSocket
接口从DataEmitter
接口继承close()
方法。
调用 close()
方法会关闭 WebSocket 连接,但要注意
实现 (WebSocketImpl.close()
) 不执行
closing handshake 这是
RFC 6455.
此外,onDisconnect()
in WebSocketImpl
关闭底层套接字
当它收到一个
close frame.
因此,无论如何,不会执行关闭握手。但是,这不是 如果您不介意服务器端的错误日志,这是一个严重的问题。
如何重试以及如何提供通知
您可以通过设置回调来检测断开连接
setClosedCallback()
方法和 setEndCallback()
方法,但我不确定。
如何重试以及如何提供通知由您决定。你可以做 检测到断线后随心所欲。
推荐
如果您想接收发生在 WebSocket 上的细粒度事件并且 想知道有关错误的详细信息, 尝试 nv-websocket-client。 它的 listener interface 有很多回调入口点,它定义了细粒度的 error codes。 新的 WebSocket 客户端库执行 closing handshake正确。