我正在使用koush的这个AndroidSync库来创建websocket(服务器/客户端)并在两个Android设备之间传输数据.这两个设备通过wifi连接(一个是Wifi AP,另一个连接到它).在发送请求4-5秒后,我在客户端设备中收到TimeoutException.这就是我到目前为止所做的......
ServerActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
mSockets = new ArrayList<WebSocket>();
mAsyncHttpServer = new AsyncHttpServer();
mWebSocketCallback = new AsyncHttpServer.WebSocketRequestCallback() {
@Override
public void onConnected(final WebSocket webSocket, RequestHeaders headers) {
mSockets.add(webSocket);
webSocket.send("Welcome Client");
webSocket.setClosedCallback(new CompletedCallback() {
@Override
public void onCompleted(Exception ex) {
try {
if (ex != null)
Log.e("WebSocket", "Error");
} finally {
mSockets.remove(webSocket);
}
}
});
webSocket.setStringCallback(new WebSocket.StringCallback() {
@Override
public void onStringAvailable(String s) {
Log.d("SERVERTAG",s);
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();
}
});
}
};
mAsyncHttpServer.websocket("/",mWebSocketCallback);
mAsyncHttpServer.listen(Utils.PORT_NUMBER); …Run Code Online (Sandbox Code Playgroud) 我正在使用Koush的AndroidAsync作为WebSocket客户端.我的代码遵循https://github.com/koush/AndroidAsync中的示例并且有效.(以下复制的例子.)
我需要我的应用程序在启动时打开websocket,但是,我需要处理一些问题:
A)我需要允许用户更改websocket服务器的地址.在这种情况下,我需要关闭现有的websocket(可能已经失败)并打开一个websocket到新服务器.
B)服务器可能已关闭或不可用.在这种情况下,我想将此报告回活动.目前它只是默默地失败.
所以按重要性排序:
如果在某处记录,请告诉我.
以下复制的网站示例代码:
AsyncHttpClient.getDefaultInstance().websocket(get,"my-protocol",new WebSocketConnectCallback(){
@Override
public void onCompleted(Exception ex,WebSocket webSocket){
if(ex!=null){
ex.printStackTrace();
return;
}
webSocket.send("a string");
webSocket.send(new byte[10]);
webSocket.setStringCallback(new StringCallback(){
public void onStringAvailable(String s){
System.out.println("I got a string: "+s);
}
});
webSocket.setDataCallback(new DataCallback(){
public void onDataAvailable(ByteBufferList byteBufferList){
System.out.println("I got some bytes!");
// note that this data has been read
byteBufferList.recycle();
}
});
}
});
Run Code Online (Sandbox Code Playgroud) 我正在通过 koush https://github.com/koush/AndroidAsync试用该库。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AsyncHttpClient.getDefaultInstance().websocket(uri, null, new AsyncHttpClient.WebSocketConnectCallback() {
@Override
public void onCompleted(Exception ex, WebSocket webSocket) {
if (ex != null) {
ex.printStackTrace();
return;
}
webSocket.send("a string");
webSocket.send(new byte[10]);
webSocket.setStringCallback(new WebSocket.StringCallback() {
public void onStringAvailable(String s) {
System.out.println("I got a string: " + s);
}
});
webSocket.setDataCallback(new DataCallback() {
public void onDataAvailable(DataEmitter emitter, ByteBufferList byteBufferList) {
System.out.println("I got some bytes!");
// note that this data has been read
byteBufferList.recycle();
}
});
}
}); …Run Code Online (Sandbox Code Playgroud) 我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是让我知道WebSocket已关闭的日志消息:
WebSocket关闭异常:recvfrom失败:ETIMEDOUT(连接超时)
但是,我们的服务器大约59秒没有收到断开连接消息.我们的服务器正在使用这些库: