Подтвердить что ты не робот

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), соединение больше не работает. Как я могу заставить соединение работать?

4b9b3361

Ответ 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. Эти команды вызывают разъединение и новое соединение.