JeuWeb - Crée ton jeu par navigateur
Nodejs - Fermeture de connexion - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Nodejs - Fermeture de connexion (/showthread.php?tid=6473)

Pages : 1 2 3


Nodejs - Fermeture de connexion - Damocorp - 30-10-2012

Bonjour,

Je m'amuse toujours a tester nodejs et socket.io pour mon tchat. Tout fonctionne nickel que ce soit le tchat, mon système de transfert d'objet etc...
Mais voila que je me heurte à un problème con. La liste des gens actuellement connectés.

J'ai accès à leur login. Je stock tout cela dans un tableau. Et lorsque que quelqu'un se déconnecte, je retire simplement le login du tableau.

Mais quand quelqu'un clique sur un lien, ferme le navigateur, je n'arrive pas à trouver le moyen de voir que la connexion est rompu.
Je peux éviter les doubles entrée dans le tableau. Mais si je me connecte avec x comptes différents, les x logins restent présent dans mon tableau.


RE: Nodejs - Fermeture de connexion - Ter Rowan - 30-10-2012

Regarde du coté des événements ( j ai plus en tête le nom de l événement, l équivalent de onload mais a l envers)

Par contre je çrois que tu ne peux pas tout capter

Une autre solution qui me vient en tête(sans verif) est d envoyer via ta chaussette une question es tu la au client toutes les x secondes. Si il ne répond pas, c est qu il n est plus la


RE: Nodejs - Fermeture de connexion - Astarion - 30-10-2012

Evénement coté serveur :

socket.on('disconnect', function() {

});

Que ça pour une fermeture de l'onglet, un changement de page, etc cela fonctionne... A toi de traiter ça comme il faut derrière !


RE: Nodejs - Fermeture de connexion - Maks - 30-10-2012

http://socket.io/#how-to-use ...


RE: Nodejs - Fermeture de connexion - quentin01 - 30-10-2012

Des fois des petites recherches ça fait pas de mal ... http://www.jeuweb.org/showthread.php?tid=8174&pid=104222#pid104222


RE: Nodejs - Fermeture de connexion - Damocorp - 30-10-2012

Citation :Des fois des petites recherches ça fait pas de mal ... http://www.jeuweb.org/showthread.php?tid...#pid104222
Citation :http://socket.io/#how-to-use ...
C'est sympa de me le rappeler, mais j'avais déjà lu tout cela avant de poster.


Citation :socket.on('disconnect', function() {

});
Que ça pour une fermeture de l'onglet, un changement de page, etc cela fonctionne... A toi de traiter ça comme il faut derrière !
Citation :Par contre je çrois que tu ne peux pas tout capter
Malheureusement Ter Rowan semble avoir raison vu le nombre de post traitant du sujet que j'ai trouvé sur stackoverflow.


Ce qui est bizarre, c'est que mes tests semblent bien détecté la déconnexion. Puisque le console.log() enregistre l'information ( mais pas toujours apparement ). Mais l'emit n'est pas envoyé ( et non présent dans la console ) !
Exemple du test :

Le server => [pastebin]M4wXFMN8[/pastebin]
Le client => [pastebin]riaRditf[/pastebin]
Résultats :
Déconnexion YBSeLXI7YSmWWIKJVc8c obtenu lorsque sous firefox je clic sur un lien ou ferme l'onglet.
Rien n'est obtenu lorsque sous Opéra je clic sur un lien ou ferme l'onglet.

Rien n'est reçu par Opéra ou Firefox ( le emit ) même si le console.log() indique la déconnexion.


Citation :ne autre solution qui me vient en tête(sans verif) est d envoyer via ta chaussette une question es tu la au client toutes les x secondes. Si il ne répond pas, c est qu il n est plus la
Je comptais justement partir sur une solution similaire. Chaque client va recevoir de la part des autres clients : le login du client connecté + un ttl. Et un simple setInterval qui virera les ttl qui dépasse x secondes.
Mais ta solution me semble plus approprié. J'vais tester cela.


RE: Nodejs - Fermeture de connexion - Maks - 30-10-2012

(30-10-2012, 05:53 PM)Damocorp a écrit :
Citation :Des fois des petites recherches ça fait pas de mal ... http://www.jeuweb.org/showthread.php?tid...#pid104222
Citation :http://socket.io/#how-to-use ...
C'est sympa de me le rappeler, mais j'avais déjà lu tout cela avant de poster.

Lire c'est bien, essayer de comprendre c'est mieux

Citation :Ce qui est bizarre, c'est que mes tests semblent bien détecté la déconnexion. Puisque le console.log() enregistre l'information ( mais pas toujours apparement ). Mais l'emit n'est pas envoyé ( et non présent dans la console ) !
Exemple du test :

Le server =>
Le client =>
Résultats :
Déconnexion YBSeLXI7YSmWWIKJVc8c obtenu lorsque sous firefox je clic sur un lien ou ferme l'onglet.
Rien n'est obtenu lorsque sous Opéra je clic sur un lien ou ferme l'onglet.

Rien n'est reçu par Opéra ou Firefox ( le emit ) même si le console.log() indique la déconnexion.

La méthode emit() envoie au client, seulement tu viens de te déconnecter...


require('/root/nodejs/node-v0.8.14/node_modules/socket.io')

Tu ne devrais pas être obligé de donner ce chemin relatif ni de vérifier l'existence de "io" coté client


RE: Nodejs - Fermeture de connexion - Damocorp - 30-10-2012

Citation :Tu ne devrais pas être obligé de donner ce chemin relatif ni de vérifier l'existence de "io" coté client
J'ai du merder l'installation car sans chemin absolu, pas moyen de trouver le module. Mais bon c'est que des tests, je réinstallerai encore tout cela pour de futur tests pour bien comprendre la différence entre une installation locale et globale que je pige pas totalement.

Citation :Tu ne devrais pas être obligé de donner ce chemin relatif ni de vérifier l'existence de "io" coté client
je n'aime pas les erreur, ca me tape sur le système et tant que j'ai pas stabilisé mon installation , j'utilise juste un moyen de virer l'erreur Big Grin

Donc à la déconnexion, la fonction callback() s'execute aléatoirement ?
Car le console.log() devrait au moins toujours être présent non ?


RE: Nodejs - Fermeture de connexion - Maks - 30-10-2012

Oui tu as du foiré quelque chose à l'installation ^^
Tu peux installer localement et globalement si tu le souhaites, ça ne prend pas beaucoup de places de toute façon.
Ton Socket.IO doit être installé localement (donc sans -g) pour y accéder depuis ton script avec require('socket.io')

A la déconnexion ton callback s’exécute toujours en théorie, je n'ai jamais eu de problème de ce côté.
Dans ta liste de transports, tu as quoi après websockets ? Sur Opera ça fait un moment que j'ai pas testé, l'ancienne version c'était du JSON-polling. Essaie de mettre le XHR polling en second dans la liste voir si c'est plus fiable.

Le console.log sera toujours présent oui vu qu'il dépend de ton daemon. Seulement le emit() ne peut fonctionner car le client s'est déconnecté. Il faut faire socket.broadcast.emit.to('nom_de_la_room') ou io.sockets.emit pour envoyer à tout le monde quelque soit la room


RE: Nodejs - Fermeture de connexion - Damocorp - 30-10-2012

Citation :Tu peux installer localement et globalement si tu le souhaites, ça ne prend pas beaucoup de places de toute façon.
Ton Socket.IO doit être installé localement (donc sans -g) pour y accéder depuis ton script avec require('socket.io')
Ce qui m'embête le plus en local, c'est que quelqu'un qui connais socket.io saura qu'il peut aller chercher les fichiers depuis l'url. Et comme je n'utilise pas de réecriture d'url pour Damocorp, ca m'embête un peu.
D'un autre côté je compte bien utiliser socket.io dans d'autre projet. L'installation globale est pour cela tout a fait approprié.
Et comme c'est un script qui va tourner via forever, le chemin absolu n'est pas dérangeant, au moins seul lui à accès au fichier.

Je sais que ca fait parano, mais étant noob et apprenant sur le tas, j'ai toujours peur de raté un truc qui filerai le moyen à quelqu'un de bousiller quoique ce soit sur le serveur.
Surtout parce que je sais que la boulette viendrai de moi Confusediffle:

Sous firefox j'ai ceci :
Code :
info  - socket.io started
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized ULftXa7r7zGX3w99C8O3
   debug - setting request GET /socket.io/1/websocket/ULftXa7r7zGX3w99C8O3
   debug - set heartbeat interval for client ULftXa7r7zGX3w99C8O3
   debug - client authorized for
   debug - websocket writing 1::
   debug - websocket writing 5:::{"name":"connected","args":[{"hello":"world"}]}
   info  - transport end (undefined)
   debug - set close timeout for client ULftXa7r7zGX3w99C8O3
   debug - cleared close timeout for client ULftXa7r7zGX3w99C8O3
   debug - cleared heartbeat interval for client ULftXa7r7zGX3w99C8O3
Déconnexion ULftXa7r7zGX3w99C8O3
   debug - broadcasting packet
   debug - discarding transport

sous opéra :
Code :
info  - socket.io started
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized 2RglQ1VHps7tJw2WDMmU
   debug - setting request GET /socket.io/1/xhr-polling/2RglQ1VHps7tJw2WDMmU?t=1351623693317
   debug - setting poll timeout
   debug - client authorized for
   debug - clearing poll timeout
   debug - xhr-polling writing 1::
   debug - set close timeout for client 2RglQ1VHps7tJw2WDMmU
   debug - setting request GET /socket.io/1/xhr-polling/2RglQ1VHps7tJw2WDMmU?t=1351623693319
   debug - setting poll timeout
   debug - clearing poll timeout
   debug - xhr-polling writing 5:::{"name":"connected","args":[{"hello":"world"}]}
   debug - set close timeout for client 2RglQ1VHps7tJw2WDMmU
   debug - discarding transport
   debug - cleared close timeout for client 2RglQ1VHps7tJw2WDMmU
   debug - setting request GET /socket.io/1/xhr-polling/2RglQ1VHps7tJw2WDMmU?t=1351623694725
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared close timeout for client 2RglQ1VHps7tJw2WDMmU

Donc si j'ai bien pigé, il est déjà en XHR polling.
Et comme tu peux le constater, firefox renvoi bien le console.log ( Déconnexion ULftXa7r7zGX3w99C8O3 ).
Tandis qu'Opéra ne fait rien.