2013-10-30 25 views
12

Trong Node.js tôi đang sử dụng websockets/ws cho kết nối WebSocket. Dưới đây là mã cho khách hàng. Giả sử ổ cắm máy chủ mà chúng ta đang kết nối để đi xuống trong một phút. Sự kiện đóng sẽ kích hoạt, nhưng cách tốt nhất để kết nối lại với ổ cắm bất cứ khi nào ổ cắm trên máy chủ bị hỏng hoặc lỗi là gì?NodeJS Websocket cách kết nối lại khi máy chủ khởi động lại

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

Trả lời

12

Tôi đã sử dụng https://github.com/joewalnes/reconnecting-websocket/blob/master/reconnecting-websocket.js với thành công.

Bạn sẽ có thể làm:

ws = new ReconnectingWebSocket('ws://....'); 
ws.reconnectInterval = 60000; // try to reconnect after 10 seconds 
+1

Thú vị. Tôi sẽ xem xét nó, nhưng tôi muốn sử dụng einaros 'ws. – wwwuser

+1

Đó là một lib phía máy khách. Bạn vẫn có thể sử dụng einaros lib trên máy chủ. –

+0

Rất tiếc, tôi thấy điều gì đang xảy ra. Bạn đang kết nối với websocket từ node.js. Điều này vẫn có thể hữu ích. Bạn có thể sử dụng nó để bọc einaros WebSocket. –

26

Hãy thử điều này:

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

Bạn có thể sử dụng việc thực hiện ban đầu mà không cần phải quấn nó.

+4

Đóng luôn luôn được gọi sau khi lỗi. Điều này sẽ gọi kết nối hai lần trên một lỗi. –

+0

@DustinGraham bạn vô tình đúng. Nó sẽ làm cho kể từ khi chỉ cần loại bỏ các cuộc gọi lại cho lỗi? Hãy tự mình chỉnh sửa câu trả lời nếu tôi không trả lời kịp thời. –

3

2018-Jan cập nhật

Kết nối lại vào một ổ cắm web bị ngắt kết nối là non-trivial, and best delegated to a library. Thư viện nhỏ nhất và được duy trì tích cực nhất cho mục đích này tại thời điểm này là reconnecting-websocket, trong đó obsoletes joewalnes's library từ câu trả lời khác. Đối với Node.js cụ thể, bạn cần chuyển một hàm tạo, chẳng hạn như WebSocket:

import WebSocket from 'ws'; 
import ReconnectingWebSocket from 'reconnecting-websocket'; 
const ws = new ReconnectingWebSocket('wss://some-feed.com', [], { 
    constructor: WebSocket, 
    connectionTimeout: ..., // in milliseconds 
    reconnectInterval: ..., 
}); 
Các vấn đề liên quan