如何在Node中捕获并处理“WebSocket已经处于CLOSING或CLOSED状态”
我一直在寻找“WebSocket 已经处于关闭或关闭状态”错误消息的解决方案,并找到了这个:
- Meteor WebSocket is already in CLOSING or CLOSED state 错误
- WebSocket 已经处于 CLOSING 或 CLOSED 状态。
答案#1 与 Meteor 严格相关,#2 没有答案......我有一个带套接字的节点服务器应用程序:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(socket) {
socket.on('message', function incoming(data) {
console.log('Incoming data ', data);
});
});
客户这样连接:
const socket = new WebSocket('ws://localhost:3090'); //Create WebSocket connection
//Connection opened
socket.addEventListener('open', function(event) {
console.log("Connected to server");
});
//Listen to messages
socket.addEventListener('message', function(event) {
console.log('Message from server ', event);
});
但是几分钟后,客户端随机断开连接并且功能
socket.send(JSON.stringify(data));
然后会抛出“WebSocket 已经处于关闭或关闭状态”。
我正在寻找一种方法来检测和处理这些断开连接并立即重新连接。
最有效的方法是什么?
回答如下:最简单的方法是在发送前检查套接字是否打开。
例如-写一个简单的函数:
function isOpen(ws) { return ws.readyState === ws.OPEN }
然后-在任何
socket.send
之前确保它是打开的:
if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));
您也可以像
this answer一样重写
send
函数,但以我的方式,您可以记录这种情况。
还有,对于你的第二个请求
立即尝试再次连接
你无法从服务器上做到这一点。
客户端代码应监视 WebSocket 状态并根据您的需要应用重新连接方法。
例如 - 检查 this VueJS 库,它做得很好。查看自动启用ws重新连接部分