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

时间:2018-01-27 05:42:00

标签: javascript node.js sockets websocket

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

  1. Meteor WebSocket is already in CLOSING or CLOSED state error
  2. WebSocket is already in CLOSING or CLOSED state.
  3. 答案#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已经处于CLOSING或CLOSED状态。”。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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库。查看启用自动重新连接部分

答案 1 :(得分:0)

嗯,我的答案很简单,就是你每隔一段时间向web socket发送消息,以了解你正在使用该服务。这比你有另一个连接要好。现在,您在 web socket 函数所在的位置启动您的项目并检查元素以查看状态 Time,并查看关闭时间的“pending”更改时间。所以现在你将定义一个间隔媒体来创建一个像这样的 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)