最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin11浏览0评论

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

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

我一直在寻找“WebSocket 已经处于关闭或关闭状态”错误消息的解决方案,并找到了这个:

  1. Meteor WebSocket is already in CLOSING or CLOSED state 错误
  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);
  });
});

客户这样连接:

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重新连接部分

发布评论

评论列表(0)

  1. 暂无评论