Node.js и Socket.IO - Как подключиться, как только произойдет отключение
Я создаю небольшой прототип с node.js и socket.io. Все работает хорошо, единственная проблема, с которой я столкнулся, заключается в том, что мое соединение node.js будет отключено, и я вынужден обновить страницу, чтобы снова подключиться и работать.
Есть ли способ восстановить соединение, как только будет запущено событие отключения?
Из того, что я слышал, это обычная проблема. Итак, я ищу оптимальный подход к решению этой проблемы:)
Большое спасибо,
Dan
Ответы
Ответ 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.");
}
});