Подтвердить что ты не робот

Node.js и Socket.IO - Как подключиться, как только произойдет отключение

Я создаю небольшой прототип с node.js и socket.io. Все работает хорошо, единственная проблема, с которой я столкнулся, заключается в том, что мое соединение node.js будет отключено, и я вынужден обновить страницу, чтобы снова подключиться и работать.

Есть ли способ восстановить соединение, как только будет запущено событие отключения?

Из того, что я слышал, это обычная проблема. Итак, я ищу оптимальный подход к решению этой проблемы:)

Большое спасибо, Dan

4b9b3361

Ответ 1

edit: Socket.io теперь имеет встроенную поддержку

Когда я использовал socket.io, отключение не произошло (только когда я закрыл сервер вручную). Но вы могли бы просто повторно подключиться после того, как скажете, например, 10 секунд о сбое или что-то в событии разъединения.

socket.on('disconnect', function(){
   // reconnect
});

Я придумал следующую реализацию:

клиентский javascript

var connected = false;
const RETRY_INTERVAL = 10000;
var timeout;

socket.on('connect', function() {
  connected = true;
  clearTimeout(timeout);
  socket.send({'subscribe': 'schaftenaar'});
  content.html("<b>Connected to server.</b>");
});

socket.on('disconnect', function() {
  connected = false;
  console.log('disconnected');
  content.html("<b>Disconnected! Trying to automatically to reconnect in " +                   
                RETRY_INTERVAL/1000 + " seconds.</b>");
  retryConnectOnFailure(RETRY_INTERVAL);
});

var retryConnectOnFailure = function(retryInMilliseconds) {
    setTimeout(function() {
      if (!connected) {
        $.get('/ping', function(data) {
          connected = true;
          window.location.href = unescape(window.location.pathname);
        });
        retryConnectOnFailure(retryInMilliseconds);
      }
    }, retryInMilliseconds);
  }

// start connection
socket.connect();
retryConnectOnFailure(RETRY_INTERVAL);

serveride (node.js):

// express route to ping server.
app.get('/ping', function(req, res) {
    res.send('pong');
});

Ответ 2

EDIT: socket.io теперь имеет встроенную поддержку повторного подключения. Используйте это.

например. (это значения по умолчанию):

io.connect('http://localhost', {
  'reconnection': true,
  'reconnectionDelay': 500,
  'reconnectionAttempts': 10
});

Это то, что я сделал:

socket.on('disconnect', function () {
  console.log('reconnecting...')
  socket.connect()
})
socket.on('connect_failed', function () {
  console.log('connection failed. reconnecting...')
  socket.connect()
})

Кажется, что это работает очень хорошо, хотя я тестировал его только на переносе websocket.

Ответ 3

Начать повторное подключение, даже если первая попытка не выполнена

Если первая попытка подключения не удалась, socket.io 0.9.16 не пытается восстановить соединение по какой-либо причине. Вот как я работал над этим.

//if this fails, socket.io gives up
var socket = io.connect();

//tell socket.io to never give up :)
socket.on('error', function(){
  socket.socket.reconnect();
});

Ответ 4

Я знаю, что у этого есть принятый ответ, но я искал навсегда, чтобы найти то, что искал, и думал, что это может помочь другим.

Если вы хотите, чтобы ваш клиент попытался повторно подключиться для бесконечности (мне нужно было это для проекта, в котором было бы подключено несколько клиентов, но мне нужно было их всегда переподключить, если я заберу сервер).

var max_socket_reconnects = 6;

var socket = io.connect('http://foo.bar',{
    'max reconnection attempts' : max_socket_reconnects
});

socket.on("reconnecting", function(delay, attempt) {
  if (attempt === max_socket_reconnects) {
    setTimeout(function(){ socket.socket.reconnect(); }, 5000);
    return console.log("Failed to reconnect. Lets try that again in 5 seconds.");
  }
});