socket.io 客户端持续重试到无法访问的主机
Posted
技术标签:
【中文标题】socket.io 客户端持续重试到无法访问的主机【英文标题】:socket.io client persistent retries to unreachable host 【发布时间】:2013-03-25 23:39:36 【问题描述】:我正在尝试从我的 socket.io-client(在 Node.js 上运行)到远程 websocket 建立持久连接。我无法控制远程套接字,有时它会完全关闭。每当发生错误或断开连接时,我想尝试重新连接()。在下面的示例中,我试图测试远程主机拒绝连接的情况。在这种情况下,我想在 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
【问题讨论】:
【参考方案1】:ECONNREFUSED
是您无法管理的异常。
试试这个:
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
;
和重新连接功能(查看 cmets 以获得解释)
function reconnect()
socket.removeAllListeners();
setTimeout(go, 1000);
可能 socket.io 重用相同的连接而不创建新的连接,强制它应用程序工作
【讨论】:
这不正确,socket.on('error'...
正在捕获此错误,它甚至再次调用重新连接(记录 connect to
代码)。在这一点上它保释了。
操作,你是对的。无论如何,您必须做一些更正,在重新连接功能中,您需要删除套接字的侦听器,否则每个侦听器都会有多个副本。
这就是票! socket.io 文档需要做一些工作,找到您在force new connection 和removeAllListeners 列出的相关部分以上是关于socket.io 客户端持续重试到无法访问的主机的主要内容,如果未能解决你的问题,请参考以下文章
angular 4/socket.io 访问全局变量和函数调用
Heroku - Socket.IO 客户端总是连接到本地主机
socket.io 服务器能否与非 socket.io 客户端通信