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).
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.
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é.
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?
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 });