NodeJS Websocket服务器重启时如何重新连接

www*_*ser 15 websocket node.js

在Node.js中,我使用websockets/ws进行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?
});
Run Code Online (Sandbox Code Playgroud)

Joh*_*nry 30

试试这个:

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();
Run Code Online (Sandbox Code Playgroud)

您可以使用原始实现而无需包装它.

  • 关闭总是在错误后被调用.这将在错误时调用两次连接. (5认同)
  • 最佳答案,简单,无依赖性 (3认同)

Tre*_*xon 12

我已成功使用https://github.com/joewalnes/reconnecting-websocket/blob/master/reconnecting-websocket.js.

你应该能够做到:

ws = new ReconnectingWebSocket('ws://....');
ws.reconnectInterval = 60000; // try to reconnect after 10 seconds
Run Code Online (Sandbox Code Playgroud)

  • 将ReconnectingWebSocket更改为https://gist.github.com/trevordixon/7239401.(第51行和第183行是新的.)然后,在你的客户端代码中,执行`var WebSocket = require('./ ReconnectingWebSocket.js')`而不是`require('ws')`,你将会使用包含在ReconnectingWebSocket中的ws库. (5认同)
  • 这是一个客户端库。您仍然可以在服务器上使用 einaros 库。 (2认同)

Moh*_*ouk 9

使用 async-await 如果 Socket 关闭或服务器上发生任何错误,客户端将永远尝试每 5 秒自动连接一次

const ws = require('ws')
let openedSocketFlag = null
const timeInterval = 5000
const port = 3000
const url = `ws://localhost:${port}`

function connect() {
  const client = new ws(url)
  return new Promise((resolve, reject) => {
    console.log('client try to connect...')

    client.on('open', () => {
      console.log('WEBSOCKET_OPEN: client connected to server at port %s', port)
      openedSocketFlag = true
      resolve(openedSocketFlag)
    })

    client.on('message', (data) => {
      console.log(data.toString())
    })

    client.on('close', (err) => {
      console.log('WEBSOCKET_CLOSE: connection closed %o', err)
      openedSocketFlag = false
      reject(err)
    })

    client.on('error', (err) => {
      console.log('WEBSOCKET_ERROR: Error', new Error(err.message))
      openedSocketFlag = 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 (!openedSocketFlag) {
    reconnect()
  }
}, timeInterval)
Run Code Online (Sandbox Code Playgroud)


Dan*_*scu 8

2018年1月更新

重新连接到断开连接的Web套接字并非易事,最好委托给库.目前用于此目的的最小且最活跃的库是reconnecting-websocket,它从另一个答案中淘汰了joewalnes的库.特别是对于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: ...,
});
Run Code Online (Sandbox Code Playgroud)