NodeJS Websocket как повторно подключиться при перезапуске сервера
В Node.js Я использую websockets/ws для подключения к WebSocket. Ниже приведен код для клиента. Скажем, серверный сокет, с которым мы подключаемся, уменьшается на минуту. Событие закрытия будет срабатывать, но какой лучший способ подключиться к сокету каждый раз, когда сокет на сервере падает или ошибки?
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?
});
Ответы
Ответ 1
Я успешно использовал https://github.com/joewalnes/reconnecting-websocket/blob/master/reconnecting-websocket.js.
Вы должны уметь:
ws = new ReconnectingWebSocket('ws://....');
ws.reconnectInterval = 60000; // try to reconnect after 10 seconds
Ответ 2
Попробуйте следующее:
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();
Вы можете использовать оригинальную реализацию, не сворачивая ее.
Ответ 3
2018 январь, обновление
Повторное подключение к отключенному веб-сокету нетривиально и лучше всего делегировать в библиотеку. Наименьшей и наиболее активно поддерживаемой библиотекой для этой цели на данный момент является повторно подключаемый 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: ...,
});
Ответ 4
Вы должны рассмотреть переход на socket.io
.
- Он имеет встроенную функцию автоматического переподключения. И вам не нужно ничего делать для этого. Он уже включен по умолчанию.
- Удивительно, но он совместим со старыми браузерами, даже браузерами, которые не поддерживают нативные веб-сокеты.
Код обоих очень похож, но socket.io
, возможно, немного короче. например, для серверного кода мы использовали написать что-то вроде этого:
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
}
}
Код Socket.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
}
Однако имейте в виду, что вы также должны переписать клиентский код. Например, для Angular я использую ngx-socket-io
, который чрезвычайно упрощает код.