我正在使用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(见本的详细信息),您的WebSocket服务器无法检测断线中的WebSocket的情况下.因此,服务器必须ETIMEDOUT
在TCP/IP的上下文中等待检测断开连接.
使用符合RFC 6455的WebSocket库并正确实现关闭握手.