javascript - 如何检查 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;
解决方案
在我看来,您的 websocket 服务器依赖于特定的端点。您遇到的错误是试图将多个 websocket 服务器绑定到同一个端口。你只需要一个 websocket 服务器来处理多个客户端连接。我建议您将它们分开,并让 websocket 服务器与 express 应用程序一起运行。
让端点执行某些操作(例如关闭 websocket)很酷,但是如果您正在做类似的事情,我建议您对它们进行身份验证。
您遇到的错误是 100% 服务器端,端口 3001 正在使用中。它试图在端口 3001 上启动一个 websocket 服务器,并且已经有一个正在运行。您可以使用不同的端口,也可以只使用原始的 websocket 服务器来服务多个客户端。
要真正回答您提出的问题,我相信这样做的正确方法是为您的 websocket 服务器实现心跳。那应该在n
几分钟/秒/毫秒后发送(我可能会用几分钟)。让它双向是个好主意,这样您的服务器和客户端就知道何时断开连接。
推荐阅读
- html - Bootstrap 对齐 col 内的元素
- python - 绘制 geopandas 数据框时无法对齐子图
- javascript - 可扩展的 p 标签在复制粘贴内容时不会按预期方式扩展
- javascript - Webextension - 在网页内容中插入 HTML 文件内容
- c# - 在 config.DependencyResolver = new UnityResolver(container); 上出现转换错误
- javascript - 仅加载一次 javascript,即使在重新加载页面后也是如此
- scala - 将 List[Either[A, B]] 展平到 List[B] 就像 List[Option[B]] 到 List[B]
- html - 带有角度边缘的自定义图表设计
- swift - 在 Firebase 中更新子节点。为什么只有一个参考被更新,而不是两个?
- python - 有没有办法使用 XlsxWriter 为包含文本的单元格着色?