Pertanyaan Node.js dan Socket.IO - Cara menyambung kembali segera setelah putuskan terjadi


Saya sedang membangun prototipe kecil dengan node.js dan socket.io. Semuanya berfungsi dengan baik, satu-satunya masalah yang saya hadapi adalah koneksi node.js saya akan terputus dan saya terpaksa me-refresh halaman untuk mendapatkan koneksi dan berjalan kembali.

Apakah ada cara untuk membangun kembali koneksi segera setelah kejadian disconnect dipecat?

Dari apa yang saya dengar, ini adalah masalah umum. Jadi, saya mencari pendekatan praktik terbaik untuk memecahkan masalah ini :)

Terima kasih banyak, Dan


35
2017-12-13 18:37


asal


Jawaban:


edit: Socket.io memiliki dukungan bawaan sekarang

Ketika saya menggunakan socket.io putuskan tidak terjadi (hanya ketika saya menutup server secara manual). Tetapi Anda bisa menyambung kembali setelah mengatakan misalnya 10 detik pada kegagalan atau sesuatu pada peristiwa putuskan.

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

Saya datang dengan implementasi berikut:

javascript sisi-klien

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);

serverside (node.js): 

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

18
2017-12-13 22:02



EDIT: socket.io sekarang memiliki dukungan rekoneksi bawaan. Gunakan itu.

misalnya (ini adalah default):

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

Ini yang saya lakukan:

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

Tampaknya bekerja cukup baik, meskipun saya hanya mengujinya pada transportasi websocket.


88
2018-03-01 00:23



Mulai menghubungkan kembali bahkan jika upaya pertama gagal

Jika upaya koneksi pertama gagal, socket.io 0.9.16 tidak mencoba menghubungkan kembali untuk beberapa alasan. Ini adalah bagaimana saya bekerja di sekitar itu.

//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
2018-03-04 15:45



Saya tahu ini memiliki jawaban yang diterima, tetapi saya mencari selamanya untuk menemukan apa yang saya cari dan berpikir ini dapat membantu orang lain.

Jika Anda ingin klien Anda mencoba untuk menghubungkan kembali tanpa batas (saya membutuhkan ini untuk proyek di mana beberapa klien akan terhubung, tetapi saya membutuhkan mereka untuk selalu terhubung kembali jika saya mengambil server ke bawah).

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.");
  }
});

1