Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS Websocket如何在服务器重新启动时重新连接_Node.js_Websocket - Fatal编程技术网

Node.js NodeJS Websocket如何在服务器重新启动时重新连接

Node.js NodeJS Websocket如何在服务器重新启动时重新连接,node.js,websocket,Node.js,Websocket,在Node.js中,我用于WebSocket连接。下面是客户端的代码。假设我们要连接的服务器套接字中断一分钟。close事件将触发,但是当服务器上的套接字出现故障或错误时,重新连接到套接字的最佳方法是什么 var ws = new WebSocket('ws://localhost'); ws.on('open', function() { console.log('socket open'); }); ws.on('error', function() { console.l

在Node.js中,我用于WebSocket连接。下面是客户端的代码。假设我们要连接的服务器套接字中断一分钟。close事件将触发,但是当服务器上的套接字出现故障或错误时,重新连接到套接字的最佳方法是什么

var ws = new WebSocket('ws://localhost');

ws.on('open', function() {
    console.log('socket open');
});
ws.on('error', function() {
    console.log('socket error');
    // how do I reconnect to the ws after x minutes here?
});
ws.on('close', function() {
    console.log('socket close');
    // how do I reconnect to the ws after x minutes here?
});
我成功地使用了它

您应该能够做到:

ws = new ReconnectingWebSocket('ws://....');
ws.reconnectInterval = 60000; // try to reconnect after 10 seconds
试试这个:

var reconnectInterval = x * 1000 * 60;
var ws;
var connect = function(){
    ws = new WebSocket('ws://localhost');
    ws.on('open', function() {
        console.log('socket open');
    });
    ws.on('error', function() {
        console.log('socket error');
    });
    ws.on('close', function() {
        console.log('socket close');
        setTimeout(connect, reconnectInterval);
    });
};
connect();
您无需包装即可使用原始实现。

2018年1月更新 无法重新连接到断开连接的web套接字。目前用于此目的的最小且维护最积极的库是,这来自另一个答案。具体来说,对于Node.js,您需要传递一个构造函数,例如WebSocket:

import WebSocket from 'ws';
import ReconnectingWebSocket from 'reconnecting-websocket';
const ws = new ReconnectingWebSocket('wss://some-feed.com', [], {
  constructor: WebSocket,
  connectionTimeout: ...,  // in milliseconds
  reconnectInterval: ...,
});

<强>您应该考虑迁移到“代码> Socket .IO < /COD> .< /强>

  • 它具有内置的自动重新连接功能。你不必为此做任何事。默认情况下,它已启用
  • 令人惊讶的是,它与旧浏览器兼容,甚至与不支持本机WebSocket的浏览器兼容
  • 两者的代码非常相似,但是
    socket.io
    可能只是稍微短一点。e、 g.对于服务器代码,我们通常编写如下代码:

    const WebSocketServer = require('websocket').server
    const ws = new WebSocketServer({ httpServer });
    ws.on('request', (request) => onConnection(request));
    
    function onConnectionRequest(request) {
      const connection = request.accept(null, request.origin);
      if (!connection) return;
      connection.on('message', (msg) => onMessageReceived(msg));
      connection.on('close', () => onConnectionClosed());
    }
    
    function onMessage(message) {
      if (message.type === 'utf8') {
        const data = message.utf8Data;
        const request = JSON.parse(data);
        // todo use request
      }
    }
    
    io代码非常相似,但只是稍微短一点

    const io = require('socket.io')(httpServer);
    io.on('connection', (socket) => onConnection(socket));
    
    function onConnection(socket) {
      socket.on('message', (msg) => onMessage(msg));
      socket.on('disconnect', (reason) => onDisconnect(reason));
    }
    
    function onMessage(request) {
      // todo use request
    }
    
    但是,请记住,您还必须重写客户机代码。
    e、 g.对于Angular,我使用了
    ngx socket io
    插件,它极大地简化了代码。

    使用异步等待如果套接字关闭或服务器上发生任何错误,客户端将尝试永远每隔5秒自动连接一次

    "use strict";
    
    var ws = require("ws");
    var url = 'ws://localhost:3000';
    var openedSocket = null;
    var timeInterval = 5000;
    
    function connect() {
      var client = new ws(url);
      return new Promise((resolve, reject) => {
        console.log("client try to connect...");
    
        client.on("open", () => {
          console.log(
            "WEBSOCKET_OPENED: client connected to server at port %s", port);
          openedSocket = true;
          resolve(openedSocket);
        });
    
        client.on("message", (data) => {
          console.log(data);
        });
    
        client.on("close", (err) => {
          console.log("WEBSOCKET_CLOSE: connection closed %o", err);
          openedSocket = false;
          reject(err);
        });
    
        client.on("error", (err) => {
          console.log("WEBSOCKET_ERROR: Error", new Error(err.message));
          openedSocket = false;
          reject(err);
        });
      });
    }
    
    async function reconnect() {
      try {
        await connect();
      } catch (err) {
        console.log("WEBSOCKET_RECONNECT: Error", new Error(err.message));
      }
    }
    
    reconnect();
    
    // repeat every 5 seconds
    setInterval(() => {
      if (openedSocket == false) {
        reconnect();
      }
    }, timeInterval);
    

    有趣。我会研究一下,但我更喜欢使用einaros的ws,它是一个客户端库。您仍然可以在服务器上使用einaros库。哎呀,我知道发生了什么。您正在从node.js连接到websocket。这仍然可能有帮助。你可以用它来包装einaros的WebSocket。我不确定我是否理解。您将如何使用它包装einaros WebSocket?您能举个例子吗?将ReconnectingWebSocket更改为类似。(第51行和第183行是新的。)然后,在您的客户端代码中,使用
    var WebSocket=require('./ReconnectingWebSocket.js')
    而不是
    require('ws')
    ,您将使用重新连接WebSocket中包装的ws库。出错后总是会调用Close。这将在出现错误时调用connect两次。@DustinGraham您完全正确。简单地删除错误回调是否会导致错误?如果我不及时回复,请随意编辑答案。最佳答案,简单无依赖性