2012-05-03 5 views
28

Как подключиться к сокету io один раз disconnect был вызван?Socket 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-бывает) – 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 показывают, что многие люди не получают события при сбое подключения, а повторное подключение не происходит автоматически.

Чтобы обойти эту проблему, можно вручную создать цикл повторного подключения следующим образом:

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

У меня возникла проблема с сокет-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); 
    }); 
});