2012-05-03 170 views
28

如何重新連接到socket io一次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

它內置到庫中。請參閱http://stackoverflow.com/a/5149185/17803 – Matt

+0

可能重複[Node.js和Socket.IO - 如何斷開連接時立即重新連接](http://stackoverflow.com/questions/4432271/node -js-and-socket-io-how-to-reconnect-as-soon-as-disconnect-happen) – Matt

+5

我不希望它在斷開連接時重新連接!我想能夠控制何時連接和斷開連接。 – Eric

回答

39

好了,你有一個不錯的選擇...

你初始化套接字值第一次你應該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 
    } 
} 
12

我知道你已經有一個答案,但我來到這裏是因爲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 
}) 
5

您可以通過下面的客戶端配置重新連接。

// 0.9 socket.io version 
io.connect(SERVER_IP,{'force new connection':true }); 

// 1.0 socket.io version 
io.connect(SERVER_IP,{'forceNew':true }); 
+2

我不認爲'forceNew'意味着重新連接。我相信這意味着每次調用這個語句時都會創建一個新的套接字,因爲如果第二次調用它,通常'io.connect()'將返回相同的套接字。 –

0

我有一個socket-io重新連接的問題。可能是這種情況會幫助別人。我有這樣的代碼:

var io = require('socket.io').listen(8080); 
DB.connect(function() { 
    io.sockets.on('connection', function (socket) { 
     initSockets(socket); 
    }); 
}); 

這是錯誤的,becase的有開放的端口分配回調之間的延遲。在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); 
    }); 
});