web-dev-qa-db-fra.com

Socket IO reconnecter?

Comment se reconnecter au socket io une fois que disconnect a été appelé?

Voici le code

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;
    }
}   

Si je fais initSocket(true), cela fonctionne. Si je fais initSocket(false), il se déconnecte. MAIS ALORS si j'essaye de me reconnecter en utilisant initSocket(true), la connexion ne fonctionne plus. Comment puis-je faire fonctionner la connexion?

35
Eric

Eh bien, vous avez une option ici ...

La première fois que vous initialisez la valeur de socket, vous devez vous connecter avec io.connect,

La prochaine fois (après avoir appelé une fois déconnecté), vous devez vous reconnecter avec socket.socket.connect().

Donc, votre initSocket, devrait être quelque chose comme

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
    }
} 
45
drinchev

Je sais que vous avez déjà une réponse, mais je suis arrivé ici parce que la fonctionnalité de reconnexion du client socket.IO est actuellement interrompue dans le nœud.

Les bogues actifs sur le dépôt github montrent que beaucoup de gens ne reçoivent pas d'événements en cas d'échec de connexion et que la reconnexion ne se produit pas automatiquement.

Pour contourner ce problème, vous pouvez créer une boucle de reconnexion manuelle comme suit:

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
})
13
Matthew F. Robben

Vous pouvez vous reconnecter en suivant la configuration côté client.

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

// 1.0 socket.io version
io.connect(SERVER_IP,{'forceNew':true });
6
Prasad Bhosale

C'est une vieille question, mais je me débattais avec cela récemment et je suis tombé ici. Les versions les plus récentes de socket.io (> 2.0) n'ont plus la propriété socket.socket Comme indiqué ici .

J'utilise socket.io-client 2.2.0 Et je faisais face à une situation où le socket semble être connecté (propriété socket.connected = true) Mais il ne communiquait pas avec le serveur.

Donc, pour résoudre ce problème, ma solution était d'appeler socket.close() et socket.open. Ces commandes forcent une déconnexion et une nouvelle connexion.

1
Aldo

J'ai eu un problème avec la reconnexion socket-io. Peut-être que ce cas aidera quelqu'un. J'avais du code comme ça:

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

c'est faux, car il y a un délai entre les rappels attribués au port ouvert. Certains messages peuvent être perdus avant l'initialisation de DB. La bonne façon de le réparer est:

var io = null;
DB.connect(function () {
    io = require('socket.io').listen(8080);
    io.sockets.on('connection', function (socket) {
        console.log("On connection");
        initSockets(socket);
    });
});
0
Stepan Yakovenko