【问题标题】:How to catch and deal with "WebSocket is already in CLOSING or CLOSED state" in Node如何在Node中捕获和处理“WebSocket已经处于CLOSING或CLOSED状态”
【发布时间】:2018-07-06 11:29:51
【问题描述】:

我一直在寻找“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 状态。”。

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

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

【问题讨论】:

  • 你可以找到答案here
  • 这是一个影响很多人的已知问题和问题。这可能会有所帮助:stackoverflow.com/a/53843646/468592
  • @JeremyHarris 链接已损坏
  • 技术上没有问题。看起来原始答案作者删除了答案。如果您有足够高的声誉,您可以看到已删除的答案。无论如何,这里似乎有一个有效的答案。

标签: javascript node.js sockets websocket


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    嗯,我的回答很简单,就是你在一段时间内向网络套接字发送消息,以了解你正在使用该服务。这比你有另一个连接要好。现在,您开始您的项目,Web 套接字功能在哪里,并检查元素以查看状态时间,并查看“待处理”更改为关闭时间的时间。所以现在你将定义一个间隔媒体来制作一个 setInterval 函数,例如:enter code here

    const conn = WebSocket("WSS://YourLocationWebSocket.com");
    setInterval(function(){
      var object = {"message":"ARandonMessage"};
      object = JSON.stringify(object);
      conn.send(object);
    },/*The time, I suggest 40 seconds, so*/ 40000)

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2014-09-10
      • 2019-04-13
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2021-03-19
      相关资源
      最近更新 更多