Node.js NodeJS Websocket如何在服务器重新启动时重新连接
在Node.js中,我用于WebSocket连接。下面是客户端的代码。假设我们要连接的服务器套接字中断一分钟。close事件将触发,但是当服务器上的套接字出现故障或错误时,重新连接到套接字的最佳方法是什么Node.js NodeJS Websocket如何在服务器重新启动时重新连接,node.js,websocket,Node.js,Websocket,在Node.js中,我用于WebSocket连接。下面是客户端的代码。假设我们要连接的服务器套接字中断一分钟。close事件将触发,但是当服务器上的套接字出现故障或错误时,重新连接到套接字的最佳方法是什么 var ws = new WebSocket('ws://localhost'); ws.on('open', function() { console.log('socket open'); }); ws.on('error', function() { console.l
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?
});
我成功地使用了它
您应该能够做到:
ws = new ReconnectingWebSocket('ws://....');
ws.reconnectInterval = 60000; // try to reconnect after 10 seconds
试试这个:
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();
您无需包装即可使用原始实现。2018年1月更新
无法重新连接到断开连接的web套接字。目前用于此目的的最小且维护最积极的库是,这来自另一个答案。具体来说,对于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: ...,
});
<强>您应该考虑迁移到“代码> Socket .IO < /COD> .< /强>
socket.io
可能只是稍微短一点。e、 g.对于服务器代码,我们通常编写如下代码:
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
}
}
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
}
但是,请记住,您还必须重写客户机代码。
e、 g.对于Angular,我使用了
ngx socket io
插件,它极大地简化了代码。使用异步等待如果套接字关闭或服务器上发生任何错误,客户端将尝试永远每隔5秒自动连接一次
"use strict";
var ws = require("ws");
var url = 'ws://localhost:3000';
var openedSocket = null;
var timeInterval = 5000;
function connect() {
var client = new ws(url);
return new Promise((resolve, reject) => {
console.log("client try to connect...");
client.on("open", () => {
console.log(
"WEBSOCKET_OPENED: client connected to server at port %s", port);
openedSocket = true;
resolve(openedSocket);
});
client.on("message", (data) => {
console.log(data);
});
client.on("close", (err) => {
console.log("WEBSOCKET_CLOSE: connection closed %o", err);
openedSocket = false;
reject(err);
});
client.on("error", (err) => {
console.log("WEBSOCKET_ERROR: Error", new Error(err.message));
openedSocket = 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 (openedSocket == false) {
reconnect();
}
}, timeInterval);
有趣。我会研究一下,但我更喜欢使用einaros的ws,它是一个客户端库。您仍然可以在服务器上使用einaros库。哎呀,我知道发生了什么。您正在从node.js连接到websocket。这仍然可能有帮助。你可以用它来包装einaros的WebSocket。我不确定我是否理解。您将如何使用它包装einaros WebSocket?您能举个例子吗?将ReconnectingWebSocket更改为类似。(第51行和第183行是新的。)然后,在您的客户端代码中,使用
var WebSocket=require('./ReconnectingWebSocket.js')
而不是require('ws')
,您将使用重新连接WebSocket中包装的ws库。出错后总是会调用Close。这将在出现错误时调用connect两次。@DustinGraham您完全正确。简单地删除错误回调是否会导致错误?如果我不及时回复,请随意编辑答案。最佳答案,简单无依赖性