为什么 AndroidAsync 断开连接时间这么长?
Why is AndroidAsync disconnect time so long?
我正在使用 AndroidAsync koush 低级网络协议库。我正在使用 WebSocket 连接到服务器。我能够连接、send/receive 消息和断开连接。我的断开连接时间很长。服务器平均 59 秒未检测到断开连接。
为了重现问题,我连接了 WebSocket,授权并开始每 10 秒 ping 一次。然后我打开飞行模式,我的网络连接断开了。这时候调用了setClosedCallback方法。以下是我记录此消息的方式:
private WebSocket mConnection;
private WebSocketConnectCallback mSocketCallback = new WebSocketConnectCallback() {
@Override
public void onCompleted(Exception ex, WebSocket webSocket) {
...
webSocket.setClosedCallback(new CompletedCallback() {
@Override
public void onCompleted(Exception ex) {
Log.d("websocket", "WebSocket closed");
if (ex != null && ex.getMessage() != null) {
Log.e("websocket", "WebSocket closed exception: " + ex.getMessage());
}
disconnect();
}
});
}
};
private void disconnect() {
mPingHandler.removeCallbacks(pingRunnable);
if (mConnection != null) {
mConnection.close();
mConnection = null;
}
}
这是让我知道 WebSocket 已关闭的日志消息:
WebSocket 关闭异常:recvfrom 失败:ETIMEDOUT(连接超时)
但是我们的服务器在大约 59 秒内没有收到断开连接消息。我们的服务器正在使用这些库:
- gevent==1.0
- gevent-websocket==0.9.2
- greenlet==0.4.2
有什么方法可以加快我这边的速度吗?是否有套接字级超时,我可以将其设置为较低的值,以便我的服务器人员更快地收到断开连接消息?
因为 AndroidAsync does not implement the closing handshake which is required by RFC 6455 (see 了解详情),您的 WebSocket 服务器无法在 WebSocket 的上下文中检测到断开连接 。因此,服务器必须在 TCP/IP 的上下文中等待 ETIMEDOUT
来检测断开连接。
使用符合 RFC 6455 并正确实现关闭握手的 WebSocket 库。
我正在使用 AndroidAsync koush 低级网络协议库。我正在使用 WebSocket 连接到服务器。我能够连接、send/receive 消息和断开连接。我的断开连接时间很长。服务器平均 59 秒未检测到断开连接。
为了重现问题,我连接了 WebSocket,授权并开始每 10 秒 ping 一次。然后我打开飞行模式,我的网络连接断开了。这时候调用了setClosedCallback方法。以下是我记录此消息的方式:
private WebSocket mConnection;
private WebSocketConnectCallback mSocketCallback = new WebSocketConnectCallback() {
@Override
public void onCompleted(Exception ex, WebSocket webSocket) {
...
webSocket.setClosedCallback(new CompletedCallback() {
@Override
public void onCompleted(Exception ex) {
Log.d("websocket", "WebSocket closed");
if (ex != null && ex.getMessage() != null) {
Log.e("websocket", "WebSocket closed exception: " + ex.getMessage());
}
disconnect();
}
});
}
};
private void disconnect() {
mPingHandler.removeCallbacks(pingRunnable);
if (mConnection != null) {
mConnection.close();
mConnection = null;
}
}
这是让我知道 WebSocket 已关闭的日志消息:
WebSocket 关闭异常:recvfrom 失败:ETIMEDOUT(连接超时)
但是我们的服务器在大约 59 秒内没有收到断开连接消息。我们的服务器正在使用这些库:
- gevent==1.0
- gevent-websocket==0.9.2
- greenlet==0.4.2
有什么方法可以加快我这边的速度吗?是否有套接字级超时,我可以将其设置为较低的值,以便我的服务器人员更快地收到断开连接消息?
因为 AndroidAsync does not implement the closing handshake which is required by RFC 6455 (see ETIMEDOUT
来检测断开连接。
使用符合 RFC 6455 并正确实现关闭握手的 WebSocket 库。