如何检查WebSocket.server连接是否打开或关闭?

时间:2018-07-06 08:05:12

标签: javascript node.js websocket

我正在使用节点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;

1 个答案:

答案 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分钟/秒/毫秒后发送(我可能会加上分钟)。最好使其具有双向性,以便服务器和客户端知道何时断开连接。