gpt4 book ai didi

javascript - Node中如何捕捉和处理 "WebSocket is already in CLOSING or CLOSED state"

转载 作者:IT老高 更新时间:2023-10-28 23:01:52 26 4
gpt4 key购买 nike

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

  1. Meteor WebSocket is already in CLOSING or CLOSED state error
  2. WebSocket is already in CLOSING or CLOSED state.

答案 #1 与 Meteor 严格相关,而 #2 没有答案...我有一个带有套接字的 Node 服务器应用程序:

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 已经处于 CLOSING 或 CLOSED 状态。”。

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

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

最佳答案

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

例如——写一个简单的函数:

function isOpen(ws) { return ws.readyState === ws.OPEN }

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

if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));

您还可以重写 send 函数,如 this answer但以我的方式,您可以记录这种情况。

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

immediately attempt to connect again

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

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

例如 - 检查 this VueJS 库做得很好。查看Enable ws reconnect automatically部分

关于javascript - Node中如何捕捉和处理 "WebSocket is already in CLOSING or CLOSED state",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48472977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com