android - 为什么 AndroidAsync 断开连接时间这么长?

标签 android websocket androidasync-koush

我正在使用 AndroidAsync koush 低级网络协议(protocol)库。我正在使用 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
  • greenlet==0.4.2

有没有办法加快我这边的速度?我可以将某个套接字级别的超时设置为较低的值,以便我的服务器人员更快地收到断开连接消息吗?

最佳答案

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

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

关于android - 为什么 AndroidAsync 断开连接时间这么长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34363183/

相关文章:

java - 如何使用 Retrofit 而不是 Volley 将图像发送到我的服务器?

android - xamarin.forms 项目构建错误输出 : max res 19, 在 Android 项目上跳过 values-v21

android - 指定Android客户端的Socket事件

android - onPongReceived 永远不会被调用

java - 在 Android 上读取内部文件的最佳方式?

Android抽屉导航菜单项无法突出显示所选项目

swift - 如何在 Web 套接字中制作红蜘蛛的单例管理器类

node.js - 调用 node app.js 时出错,[node js socket io]如何修复?

node.js - 使用 sockjs 的 channel (node.js、socket.io)

android - 使用 Ion 覆盖 HostnameVerifier