首页 > 解决方案 > 如何检查 WebSocket.server 连接是打开还是关闭?

问题描述

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

这就是我在 router.get 上方的内容

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;

标签: javascriptnode.jswebsocket

解决方案


在我看来,您的 websocket 服务器依赖于特定的端点。您遇到的错误是试图将多个 websocket 服务器绑定到同一个端口。你只需要一个 websocket 服务器来处理多个客户端连接。我建议您将它们分开,并让 websocket 服务器与 express 应用程序一起运行。

让端点执行某些操作(例如关闭 websocket)很酷,但是如果您正在做类似的事情,我建议您对它们进行身份验证。

您遇到的错误是 100% 服务器端,端口 3001 正在使用中。它试图在端口 3001 上启动一个 websocket 服务器,并且已经有一个正在运行。您可以使用不同的端口,也可以只使用原始的 websocket 服务器来服务多个客户端。

要真正回答您提出的问题,我相信这样做的正确方法是为您的 websocket 服务器实现心跳。那应该在n几分钟/秒/毫秒后发送(我可能会用几分钟)。让它双向是个好主意,这样您的服务器和客户端就知道何时断开连接。


推荐阅读