如果在调用disconnect
后如何重新连接到套接字io?
这是代码
function initSocket(__bool){
if(__bool == true){
socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});
socket.on('connect', function(){console.log('connected')});
socket.on('disconnect', function (){console.log('disconnected')});
}else{
socket.disconnect();
socket = null;
}
}
如果我initSocket(true)
,它就有效。如果我执行initSocket(false)
,则会断开连接。但是,如果我尝试使用initSocket(true)
重新连接,则连接不再起作用。如何才能使连接正常工作?
答案 0 :(得分:45)
嗯,你有一个选择......
首次初始化套接字值时,您应该与io.connect
,
下次(在您断开一次断开连接后),您应该与socket.socket.connect()
连接。
所以你的initSocket
应该是
function initSocket(__bool){
if(__bool){
if ( !socket ) {
socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false});
socket.on('connect', function(){console.log('connected')});
socket.on('disconnect', function (){console.log('disconnected')});
} else {
socket.socket.connect(); // Yep, socket.socket ( 2 times )
}
}else{
socket.disconnect();
// socket = null; <<< We don't need this anymore
}
}
答案 1 :(得分:13)
我知道你已经有了答案,但我到了这里是因为socket.IO客户端重新连接功能目前在节点中被破坏了。
github repo上的活动错误表明很多人没有在连接失败时获取事件,并且没有自动重新连接。
要解决此问题,您可以按如下方式创建手动重新连接循环:
var socketClient = socketioClient.connect(socketHost)
var tryReconnect = function(){
if (socketClient.socket.connected === false &&
socketClient.socket.connecting === false) {
// use a connect() or reconnect() here if you want
socketClient.socket.connect()
}
}
var intervalID = setInterval(tryReconnect, 2000)
socketClient.on('connect', function () {
// once client connects, clear the reconnection interval function
clearInterval(intervalID)
//... do other stuff
})
答案 2 :(得分:6)
您可以按照客户端配置重新连接。
// 0.9 socket.io version
io.connect(SERVER_IP,{'force new connection':true });
// 1.0 socket.io version
io.connect(SERVER_IP,{'forceNew':true });
答案 3 :(得分:1)
这是一个古老的问题,但是我最近对此很挣扎,在这里偶然发现。指出here的最新版本的socket.io(> 2.0)不再具有socket.socket
属性。
我正在使用socket.io-client 2.2.0
,并且遇到套接字似乎已连接(属性socket.connected = true
)但未与服务器通信的情况。
因此,要解决此问题,我的解决方案是调用socket.close()
和socket.open
。这些命令会强制断开连接并重新建立连接。
答案 4 :(得分:0)
我遇到了socket-io重新连接的问题。可能这种情况会对某人有所帮助。我有这样的代码:
var io = require('socket.io').listen(8080);
DB.connect(function () {
io.sockets.on('connection', function (socket) {
initSockets(socket);
});
});
这是错误的,因为开放端口分配的回调之间存在延迟。在初始化DB之前,某些消息可能会丢失。解决问题的正确方法是:
var io = null;
DB.connect(function () {
io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
console.log("On connection");
initSockets(socket);
});
});