我正在使用AndroidAsync库,这是一个由koush编写的低级网络协议库。我通过WebSocket连接到服务器后能够发送/接收消息并断开连接。但是,我的断开时间非常长,平均需要59秒才能被服务器检测到。
为了重现这个问题,我会先通过WebSocket连接并进行授权,然后每10秒钟开始ping操作。当我打开飞行模式或者我的网络连接中断时,setClosedCallback方法就会被调用。以下是我记录这条信息的方式:
这是 WebSocket 关闭的日志消息: WebSocket 关闭异常: recvfrom 失败: ETIMEDOUT (连接超时) 然而,我们的服务器大约需要 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