Websocket 关闭代码:1006 Node Android okhttp3 AmazonEc2



我在使用Websocketws is closed with code: 1006 reason:时遇到问题

环境

Amazon EC2 Instance  : t2.micro Ubuntu 18.04
Node : v12.16.3
Websocket : https://github.com/websockets/ws : 7.3.0
MongoDb : shell version v4.2.6
MongoDriver : NodeJs 3.5.7
Okhhtp3 : implementation 'com.squareup.okhttp3:okhttp:4.6.0'

我正在从 Websockets -> MongoDb 获取数据并尝试填充到回收器视图中。 如果我做 log.d,数据会很好,但是当我填充到回收器视图中时 - 它在应用程序启动时做得很好,在进入活动时又一次,但之后我开始收到 1006 错误。

NodeJs (服务器(

// Websocket variables
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8000 });
console.log('Websocket active on port 8000...');
// Connect To Mongo
MongoClient.connect(url, { useUnifiedTopology: true, authSource: 'admin' }, function (err, client) {
if (err) {
throw err;
}
const db = client.db(dbName);
// New Connection
wss.on('connection', function connection(ws) {
// Message Received
ws.on('message', function incoming(message) {
// Json Parse String To Access Child Elements
var iJson = JSON.parse(message);
const c = db.collection('chats');
c.find({ "owner": iJson.owner_id }).toArray(function (err, docs) {
ws.send(JSON.stringify(docs));
});
});
// Connection Closed
ws.on('close', function close(code, reason) {
console.log('ws is closed with code: ' + code + ' reason: ' + reason);
});
});
});

安卓 (客户端(

private WebSocket webSocket;
// Initiate The Socket Connection
private void initiateSocketConnection() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(WebSocketClient.SERVER_PATH).build();
webSocket = client.newWebSocket(request, new SocketListener());
}
// Private WebSocketListener Class
private class SocketListener extends WebSocketListener {
public SocketListener() {
super();
}
@Override
public void onClosed(@NotNull WebSocket webSocket,
int code,
@NotNull String reason) {
super.onClosed(webSocket,
code,
reason);
Log.d("TAG",
"onClosed: " + code + "-" + reason);
}
@Override
public void onFailure(@NotNull WebSocket webSocket,
@NotNull Throwable t,
okhttp3.@org.jetbrains.annotations.Nullable Response response) {
super.onFailure(webSocket,
t,
response);
}
@Override
public void onMessage(@NotNull WebSocket webSocket,
@NotNull String text) {
super.onMessage(webSocket,
text);
String chat = "{"chat":" + text + "}";
Log.d("TAG",
"onMessage: " + chat);
lIndividualChatList.clear();
try {
JSONObject jsonObject = new JSONObject(chat.trim());
// Check If User Array Has Anything
JSONArray returnArray = jsonObject.getJSONArray("chat");
for (int l = 0; l < returnArray.length(); l++) {
if (returnArray.length() > 0) {
// Get The Json Object
JSONObject returnJSONObject = returnArray.getJSONObject(l);
// Get Details
String owner = returnJSONObject.optString("owner");
lIndividualChatList.add(new IndividualListModel(owner));
}
}
// Use The Adapter To Populate The Recycler View
aIndividualChatList = new IndividualListAdapter(lIndividualChatList);
rvList.setAdapter(aIndividualChatList);
aIndividualChatList.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onOpen(@NotNull WebSocket webSocket,
okhttp3.@NotNull Response response) {
super.onOpen(webSocket,
response);
}
}

奇怪的是,它在失败之前工作了一两次,这引起了混乱。 如果它总是失败并喜欢一只日志猫,那就太好了。 最好的方法是记录服务器和客户端上所有可能的错误/故障并查看消息。

首先将日志放入失败状态

@Override
public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, okhttp3.@org.jetbrains.annotations.Nullable Response response) {
super.onFailure(webSocket, t, response);
Log.d("TAG", "websocket failure: " + t + response);
}

这给出了以下消息:

: `websocket failure: android.view.ViewRootImpl$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views.null`

然后将回收器视图的填充包装在此

getActivity().runOnUiThread(new Runnable() {
public void run() {
// Poplulate the recycler view here....
}

最新更新