我正在使用节点js,无法弄清楚如何检查WebSocket.Server连接是打开还是关闭,是否有类似socket.readyState的功能?
我问是因为我有问题,当我和其他人同时加载192 ...... / xxx时,我收到错误Error: listen EADDRINUSE :::3001
,无法弄清楚它在哪里爆炸。
我还要提一下,我确实关闭了连接,但仅在一个地方,这是我的代码示例;
router.get('/', function(req, res, next) {
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('Client: Im on... /zzz');
})
});
wss.on('error', function error(err) {
console.log(wss.clients);
next(err);
});
//??
//wss.clients.clear();
db.all('SELECT rowid, * FROM ZZZZZZZZ', (err, rows) => {
//idk if its ok
if (err) next(err);
if (rows.length == 0) {
res.render('xxxxx/index', {
AAA: 'empty'
});
} else {
wss.close(function(err) {
if (err) next(err);
console.log('closing websocket at /zzz');
server.close();
setTimeout(function() {
wss = new WebSocket.Server({
port: 3001
});
}, 100);
});
res.render('xxx/index', {
AAA: rows
});
}
});
});
这是我路由器上面的东西。
let express = require('express');
let router = express.Router();
let sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('./xx/xx/xx/xxx/xx/xxx.db');
let WebSocket = require('ws');
let wss = new WebSocket.Server({ port: 3001 });
let server = wss._server;
答案 0 :(得分:0)
在我看来,您的websocket服务器依赖于特定的端点。您遇到的错误是试图将多个websocket服务器绑定到同一端口。您只需要一个websocket服务器即可处理多个客户端连接。我建议您将它们分开,并让Websocket服务器与Express应用程序一起运行。
让端点执行某些操作(如关闭websocket)很酷,但是如果您正在执行类似的操作,我建议对它们进行身份验证。
您遇到的错误是100%服务器端,正在使用端口3001。它正在尝试在端口3001上启动Websocket服务器,并且已经有一个正在运行。您可以使用其他端口,也可以仅使用原始的websocket服务器为多个客户端提供服务。
要真正回答您提出的问题,我相信这样做的正确方法是为您的Websocket服务器实现心跳。该时间应在Caused by: java.lang.ClassNotFoundException: Could not load requested class : datetime
分钟/秒/毫秒后发送(我可能会加上分钟)。最好使其具有双向性,以便服务器和客户端知道何时断开连接。