为什么AndroidAsync断开时间这么久?

为什么AndroidAsync断开时间这么久?,第1张

概述我正在使用AndroidAsynckoush低级网络协议库.我正在使用WebSocket连接到服务器.我能够连接,发送/接收消息和断开连接.我的断开时间很长.服务器平均没有检测到断开连接59秒.为了重现这个问题,我连接了WebSocket,授权并每隔10秒开始ping一次.然后我打开飞机模式,我的网络连接断开.

我正在使用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
> greenlet == 0.4.2

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

解决方法:

由于AndroidAsync未实现RFC 6455所需的closing handshake(有关详细信息,请参见this),因此WebSocket服务器无法检测WebSocket上下文中的断开连接.因此,服务器必须在TCP / IP上下文中等待ETIMEDOUT才能检测到断开连接.

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

总结

以上是内存溢出为你收集整理的为什么AndroidAsync断开时间这么久?全部内容,希望文章能够帮你解决为什么AndroidAsync断开时间这么久?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存