3

我正在使用 AndroidAsync koush 低级网络协议库。我正在使用 WebSocket 连接到服务器。我能够连接、发送/接收消息和断开连接。我的断线时间很长。服务器平均 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
  • 小绿==0.4.2

有没有办法加快我的速度?是否有某个地方的套接字级别超时,我可以将其设置为较低的值,以便我的服务器人员更快地获得断开连接消息?

4

1 回答 1

9

因为AndroidAsync没有实现RFC 6455要求的关闭握手(有关详细信息,请参阅内容),因此您的 WebSocket 服务器无法在 WebSocket 的上下文中检测到断开连接。因此,服务器必须在 TCP/IP 的上下文中等待检测断开连接。ETIMEDOUT

使用符合 RFC 6455 并正确实现关闭握手的 WebSocket 库。

于 2015-12-19T08:21:48.120 回答