我正在使用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断开时间这么久?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)