如何在Node中捕获并处理"WebSocket已处于CLOSING或CLOSED状态"

ade*_*ago 16 javascript sockets websocket node.js

我一直在寻找"WebSocket已处于CLOSING或CLOSED状态"问题的解决方案,并发现:

  1. Meteor WebSocket已处于CLOSING或CLOSED状态错误
  2. 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);
  });
});
Run Code Online (Sandbox Code Playgroud)

客户端连接如下:

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);
});
Run Code Online (Sandbox Code Playgroud)

但是几分钟后,客户端随机断开连接和功能

socket.send(JSON.stringify(data));
Run Code Online (Sandbox Code Playgroud)

然后将抛出"WebSocket已经处于CLOSING或CLOSED状态.".

我正在寻找一种方法来检测和处理这些断开连接,并立即尝试再次连接.

什么是最正确有效的方法?

yey*_*eya 20

最简单的方法是在发送之前检查套接字是否打开。

例如 - 编写一个简单的函数:

function isOpen(ws) { return ws.readyState === ws.OPEN }
Run Code Online (Sandbox Code Playgroud)

然后 - 在任何之前socket.send确保它是打开的:

if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));
Run Code Online (Sandbox Code Playgroud)

您也可以sendthis answer一样重写函数,但按照我的方式,您可以记录这种情况。

而且,对于您的第二个请求

立即尝试再次连接

您无法从服务器执行此操作。

客户端代码应监控 WebSocket 状态并根据您的需要应用重新连接方法。

例如 - 检查这个做得很好的 VueJS 库。查看启用 ws 自动重新连接部分