Socket IO повторно подключается?
Как снова подключиться к сокету io после disconnect
?
Здесь код
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)
, соединение больше не работает. Как я могу заставить соединение работать?
Ответы
Ответ 1
Ну, у вас есть выбор здесь...
При первом инициализации значения сокета, которое вы должны подключить с помощью 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
}
}
Ответ 2
Я знаю, что у вас уже есть ответ, но я пришел сюда, потому что функция пересоединения клиента socket.IO в данный момент разбита на node.
Активные ошибки в репозитории 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
})
Ответ 3
Вы можете подключиться, выполнив следующую конфигурацию на стороне клиента.
// 0.9 socket.io version
io.connect(SERVER_IP,{'force new connection':true });
// 1.0 socket.io version
io.connect(SERVER_IP,{'forceNew':true });
Ответ 4
У меня возникла проблема с подключением 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);
});
});
Ответ 5
Это старый вопрос, но я недавно с этим боролся и тут наткнулся. Самые последние версии socket.io(> 2.0) больше не имеют свойства socket.socket
, как указано здесь.
Я использую socket.io-client 2.2.0
и я столкнулся с ситуацией, когда сокет, кажется, подключен (свойство socket.connected = true
), но он не взаимодействовал с сервером.
Итак, чтобы исправить это, моим решением было вызвать socket.close()
и socket.open
. Эти команды вызывают разъединение и новое соединение.