socket.io客户端持久重试到不可访问的主机

我试图从我的socket.io客户端(运行在Node.js)到远程websocket持久连接。 我无法控制远程套接字,有时可能完全失效。 我想尝试重新连接(),每当一个错误或断开连接发生。 在下面的例子中,我试图testing远程主机拒绝连接的情况。 在这种情况下,我想在1秒后尝试重新连接。 它会再次调用,然后退出。

代码如下:

var events = require('events'), util = require('util'), io = require('socket.io-client'), url = "ws://localhost:12345", // intentionally an unreachable URL socketOptions = { "transports" : [ "websocket" ], "try multiple transports" : false, "reconnect" : false, "connect timeout" : 5000 }; // The goal is to have this socket attempt to connect forever // I would like to do it without the built in reconnects, as these // are somewhat unreliable (reconnect* events not always firing) function Test(){ var self = this; events.EventEmitter.call(self); var socket; function reconnect(){ setTimeout(go, 1000); } function go(){ console.log("connecting to", url, socketOptions); socket = io.connect(url, socketOptions); socket.on('connect', function(){ console.log("connected! wat."); }); socket.on('error', function(err){ console.log("socket.io-client 'error'", err); reconnect(); }); socket.on('connect_failed', function(){ console.log("socket.io-client 'connect_failed'"); reconnect(); }); socket.on('disconnect', function(){ console.log("socket.io-client 'disconnect'"); reconnect(); }); } go(); } util.inherits(Test, events.EventEmitter); var test = new Test(); process.on('exit', function(){ console.log("this should never end"); }); 

在节点0.11.0下运行时,我得到以下内容:

 $ node socketio_websocket.js connecting to ws://localhost:12345 { transports: [ 'websocket' ], 'try multiple transports': false, reconnect: false, 'connect timeout': 5000 } socket.io-client 'error' Error: connect ECONNREFUSED at errnoException (net.js:878:11) at Object.afterConnect [as oncomplete] (net.js:869:19) connecting to ws://localhost:12345 { transports: [ 'websocket' ], 'try multiple transports': false, reconnect: false, 'connect timeout': 5000 } this should never end 

ECONNREFUSED是您不能pipe理的例外。 试试这个:

 process.on('uncaughtException', function(err) { if(err.code == 'ECONNREFUSED'){ reconnect(); } } 

编辑

修改这样的选项:

 socketOptions = { "transports" : [ "websocket" ], "try multiple transports" : false, "reconnect" : false, 'force new connection': true, // <-- Add this! "connect timeout" : 5000 }; 

和重新连接function(请参阅注释以获得解释)

 function reconnect(){ socket.removeAllListeners(); setTimeout(go, 1000); } 

可能socket.io重用相同的连接,而不创build一个新的,迫使它的应用程序的作品