La connexion du client socket.io ne peut pas être faite la deuxième fois

Actuellement, je suis en train d’implémenter une API en utilisant nodejs express. Elle doit ensuite se connecter à socket.io et envoyer un événement.

L’API se trouve dans socket.io-client (client) et se connecte à socket.io (serveur).

1er appel API: succès

La connexion est établie pour le 1er appel de l’API, le message est envoyé et le socket peut être déconnecté. Le rappel de «déconnexion» est appelé à la fois côté client et côté serveur.

2ème appel API: échec

Lorsque la deuxième fois que l’API est appelée, la connexion au serveur ne peut pas être établie. Le rappel ‘client’ côté client n’est pas appelé.

3ème appel API: succès

Ensuite, j’ai essayé de redémarrer le côté client, en laissant les autres choses inchangées. L’API est appelée à nouveau et la connexion à socket.io est établie avec succès et tout va bien.

Quelqu’un peut-il expliquer la logistique derrière cela?

Mis à jour

client.js

App.getByUserId(message.to_id, function(error, app) { var socket = io.connect('http://127.0.0.1:9002'); socket.on('connect', function(){ console.log("client connect socket id:" + socket.id); console.log("appkey:" + app.private_token); socket.emit('appkey.check',{appkey: app.private_token, uuid: message.to_id.uuid}, function(data){ socket.emit("forceDisconnect"); socket = null; }); }); 

Vous venez de bash l’une des nombreuses “fonctionnalités” ou “bugs” de Socket.IO, selon votre perception. Socket.IO essaie d’être intelligent et de réutiliser les connexions (ce qui cause beaucoup de problèmes de connexion). Pour contourner ce problème, utilisez l’option io.connect force new connection dans votre io.connect :

io.connect('http://127.0.0.1:9002', { 'force new connection': true });

Ce que vous pouvez également faire est d’utiliser https://github.com/primus/primus, qui encapsule Socket.IO si vous utilisez le transformateur socket.io. En interne, il supprime complètement l’utilisation de io.connect et utilise le constructeur beaucoup plus bas de io.Socket pour créer des connexions plus stables que celles que vous obtiendriez avec un stock socket.io.

Avec le socket 1.0+, vous devez utiliser ceci pour forcer une nouvelle connexion.

 io.connect(SERVER_IP, { 'forceNew': true });