Javascript 如何抓住和处理;WebSocket已处于关闭或关闭状态”;在节点中

Javascript 如何抓住和处理;WebSocket已处于关闭或关闭状态”;在节点中,javascript,node.js,sockets,websocket,Javascript,Node.js,Sockets,Websocket,我一直在寻找“WebSocket已处于关闭或关闭状态”问题的解决方案,发现: 答案#1表示与流星严格相关,而#2没有答案。。。我有一个带有套接字的节点服务器应用程序: const WebSocket = require('ws'); const wss = new WebSocket.Server({ server }); wss.on('connection', function connection(socket) { socket.on('message', function i

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

  • 答案#1表示与流星严格相关,而#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 }
    
    然后-在任何
    套接字之前。发送
    确保它已打开:

    if (!isOpen(socket)) return;
    socket.send(JSON.stringify(data));
    
    您也可以像这样重写
    send
    函数,但以我的方式,您可以记录这种情况

    还有,你的第二个要求

    立即尝试再次连接

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

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


    例如,检查VueJS库是否能很好地完成这项工作。请看Enable ws reconnect automatically部分,我的答案很简单,就是您在一段时间内向web套接字发送消息,以了解您正在使用该服务。这比你得到另一个连接要好。现在,您开始您的项目,其中有web套接字函数和检查元素,以查看状态时间,并查看关闭时“挂起”的更改时间。因此,现在您将定义一个interval媒体,使setInterval函数如下所示,例如:
    在此处输入code

    const conn=WebSocket(“WSS://YourLocationWebSocket.com”);
    setInterval(函数(){
    var object={“message”:“ARandonMessage”};
    object=JSON.stringify(对象);
    控制发送(对象);
    
    },/*时间,我建议为40秒,因此*/40000)
    可能重复的问题您可以找到答案这是一个已知的问题,影响了很多人。这可能有助于: