IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Socket.IO : Socket.emit ne s'envois pas au serveur


Sujet :

NodeJS

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut Socket.IO : Socket.emit ne s'envois pas au serveur
    Salut,

    J'ai une application qui permet d'envoyé une notification à chaque connexion d'un membre.

    Voici mon code serveur app.js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var https = require('https');
    var mysql = require('mysql');
    var fs = require('fs');
    var options = {key:fs.readFileSync('../../etc/apache2/ssl/key.key'),cert:fs.readFileSync('../../etc/apache2/ssl/cert.crt')};
    var server = https.createServer(options,app);
    var connect = mysql.createConnection({host:'****',user:'****',password:'****',database:'****'});
    var io = require('socket.io')(server);
     
    io.sockets.on('connection', function(socket){
        socket.on('loggued', function(){
            socket.emit('msg', 'Vous êtes connecté !');
        });
    });
     
    server.listen(1812);
    Le problème c'est que mon serveur ne reçois pas l'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.emit('loggued');
    J'exécute ce code dans le script de connexion des membres en ajax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $.ajax({
        url: 'functions/login.func.php',
        type: 'post',
        cache: 'false',
        dataType: 'json',
        data: {email:email, mdp:mdp},
        success: function(json){
            if(json.reponse === 'member'){ /* Si un membre se connecte */
                setTimeout(function(){ $(location).attr('href','../home'); },1800);
                socket.emit('loggued');
            } else if(json.reponse === 'admin'){ /* Si l'administrateur se connecte */
                setTimeout(function(){ $(location).attr('href','../admin'); },1800);
                socket.emit('loggued');
            } else { /* Erreur de connexion */
                $('#notif').hide().html('<div class="notif_error" id="notif_json">'+json.reponse+'</div>').fadeIn();
                $('button[name=login]').html('Connexion');
                $('button[name=login]').prop('disabled', false);
                $('#mdp').val('');
                $('.btn_success').removeClass('progress');
                $('#email').focus();
            }
        }
    });
    Mais je pense que le problème vient de la redirection faite par js :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(location).attr('href','../admin');
    Avez-vous une idée pour résoudre ce problème ?
    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Salut

    Mais je pense que le problème vient de la redirection faite par js :
    A priori aucun rapport, car tu peux inverser ton setTimeout et ton socket.emit, aucune différence. (d'ailleurs, par curiosité, pourquoi un setTimeout?)

    Le problème c'est que mon serveur ne reçois pas l'appel :
    Est-ce que le client l'envoi? passe en mode debug http://socket.io/docs/logging-and-debugging/

  3. #3
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Salut,

    Le setTimeout sert à faire patientez le membre pendant la connexion, c'est du design on va dire ^^ mais ça n'a rien a voir avec le problème.

    Le client envois bien au serveur qui me répond :

    Nom : Sans titre 2.jpg
Affichages : 1182
Taille : 36,2 Ko

    Et ensuite la page est redirigé et ce message disparaît, donc l'erreur doit venir de la redirection ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Le problème c'est que mon serveur ne reçois pas l'appel :
    Le client envois bien au serveur qui me répond
    Du coup quel et le problème exactement? je ne suis pas sur de comprendre.

  5. #5
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Le problème c'est que j'ai une connexion en ajax pour identifier les membres (Voir le code ajax).
    Si la connexion réussi, j'envois un évènement au serveur (loggued) qui doit me renvoyer un message (Connecté) pour créer une notification de connexion pour le membre.

    Et le serveur n'envois pas le message, parce que la page est redirigé à cause de $(location).attr('href','../home');

    Il faudrait peut-être faire une redirection au niveau du serveur ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Désolé, j'ai lu «Le client envois bien au serveur qui me répond» avec un point final, et pas « me réponds ce log»

    Par contre, le log que tu donnes ne semble pas correspondre au code que tu nous donnes à moins que le message émis pas le serveur est "Connecté" et non "Vous êtes connecté !", auquel cas ton serveur à bien répondu au client qui à reçu le message de connexion... par contre je ne vois nulle par dans ton code client un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    socket.on('msg', function() {
      console.log('j'ai reçu la validation de connexion du serveur!');
    })
    Ce serait ça ton problème?

    De plus, j'ai beau me triturer le crane, je ne comprends pas pourquoi tu ajoutes un serveur node.js pour signifier que ton client c'est bien loggué, pour le rediriger dans la seconde sur une url visiblement réservé aux personnes connectés

  7. #7
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Pour le log, désolé j'avais modifier le message ^^
    Et j'ai bien mis côté client dans la page home :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.on('loggued', function(msg){ /* Code jquery pour afficher le message */ });
    L'intérêt d'un serveur node, ce n'est pas vraiment d'afficher un message "Vous êtes bien connecté"
    mais c'est de pouvoir faire du temps réel avec une messagerie instantannée, des notifications, et un flux de publications et tout ca en temps réel.

    Pour le message du log que j'ai envoyé par pièce jointe, ce message s'affiche pendant la connexion dans la page "login" et disparaît après la redirection et donc l'évènement "loggued" n'existe pas pour lancer l'appel du message puisqu'il se trouve uniquement dans la connexion ajax dans la page login.

    Est-ce que t'a compris ? parce que j'explique très mal je crois

    Je veux juste comprendre comment faire pour que à chaque connexion d'un membre, il voit une notification : Vous êtes bien connecté !
    C'est juste un exemple.

    Merci d'avance si tu peux m'aider

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    alors c'est dans les pages members et admin que doit ce trouver l'émission et la reception de ton message, car ta socket coté client est initialisée à chaque chargement de page (en fait, c'est tout le contexte JavaScript qui est réinitialisé).

    pour bien visualiser la chose ajoute ce qui est en gras et regarde tes logs coté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    var https = require('https');
    var mysql = require('mysql');
    var fs = require('fs');
    var options = {key:fs.readFileSync('../../etc/apache2/ssl/key.key'),cert:fs.readFileSync('../../etc/apache2/ssl/cert.crt')};
    var server = https.createServer(options,app);
    var connect = mysql.createConnection({host:'****',user:'****',password:'****',database:'****'});
    var io = require('socket.io')(server);
     
    io.sockets.on('connection', function(socket){
        socket.on('loggued', function(){
            socket.emit('msg', 'Vous êtes connecté !');
        });
        
        socket.on('disconnect', function(){
            console.log('le client est déconnecté !');
        }); 
    
    });   
    
    server.listen(1812);
    

  9. #9
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Je vois ce que ça fait :

    Dès que la redirection se fait, il y a bien le message : "le client est déconnecté !" le socket se déconnecte et c'est tout à fait normal.
    J'aimerais savoir comment faire pour éviter ça ?
    Créer un tableau avec tous les membres qui viennent de se connecté ?

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    J'aimerais savoir comment faire pour éviter ça ?
    tu ne peux pas car

    (...) ta socket coté client est initialisée à chaque chargement de page (en fait, c'est tout le contexte JavaScript qui est réinitialisé).
    et le fait que ton client soit déconnecté te fais perdre la session, tu ne peux donc pas suivre ton client de pages en pages.

    Aprés, tu peux toujours jouer avec localStorage et redis pour gerer toi-même les sessions ... mais bon... mon avis qui vaut ce qu'il vaut, défini déjà clairement ton besoin pour déterminer si tu as vraiment besoin de te casser la tête.

  11. #11
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    On peut utiliser un serveur node pour recharger un fichier php à interval de 2 min par exemple ?
    Par exemple pour afficher en temps réel les publications, messages et notifications à partir de fichiers php

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    On peut utiliser un serveur node pour recharger un fichier php à interval de 2 min par exemple ?
    oui, comme il est certainement possible de manger une soupe avec deux fourchettes en les superposant
    mais non, car ce n'a pas été designer pour cela.

    Par exemple pour afficher en temps réel les publications, messages et notifications à partir de fichiers php
    même réponse qu’au-dessus. Les websockets sont un canal bidirectionnel permanent pour transmettre de l’information, cad le contenu des publications, messages et notification; dans le cas de socket.io, ces informations sont donc censées passer par ton serveur node. Utiliser socket.io, juste pour faire de la notification, c'est ce compliquer la vie.

    Sinon, tu peux jeter un coup d'oeil à http://elephant.io. je ne sais pas ce que ça donne, mais si tu tiens à passer par les ws, cela devrais t'ouvrir des perspectives.

  13. #13
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Mais justement, j'aimerais transmettre des informations comme le contenu des publications, notifications, et messages.
    Je ne veux pas seulement transmettre des notifications, je veux aussi faire ça avec les publications, et messages.

    J'ai vu certains tutos, et on peut créer un t'chat en envoyant au serveur un message, pour qu'il soit affiché en temps réel.
    Donc c'est possible ?

    Avec mysql et socket.io ?

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    bien sur que c'est possible, mais pas de la façon dont tu semblait l'envisager. Ton chat «tourne» dans ton serveur node, et sans rapport avec tes scripts php (sauf à utiliser elephant.io) et il n'est pas question de conserver une notion de session tel quel en changeant de page, ce qui était ta problématique initiale.

  15. #15
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Alors, j'ai une question qui n'a pas été proposé dans les tutos que j'ai vu :

    Comment on peut faire pour créer un espace membre en php, avec des intéractions avec le serveur pour afficher en temps réel des notifications, messages et publications liés aux membres ?

    Faut-il que j'utilise elephant.io ?

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    La réponse n'est pas simple, je te dirais donc cela dépends...
    De ce que j'ai vu de elephant.io (que je ne connais pas) ce n'est pas très avancé, et tu dois clore la connexion après émission?!?

    Il faut juste avoir en tête que tu vas avoir deux serveur. Un en PHP qui va construire et servir des pages HTML, et un serveur node que va gérer les ws. Le problème c'est de faire communiquer les deux coté serveur avec chacun leur session et leur logique propre (très différente).

    Donc dans le cas d'un chat, pas besoin (a priori) de faire communiquer les deux, puisque si son accès et limité aux membres, l'authentification aura été gérer préalablement en PHP pour accéder à la page qui contient le chat. Ensuite l'échange de données du chat est gérer par node, et cela dans une page unique.

    Dans le cas de notification, déjà quel type de notification? est-ce en fonction d'une session user authentifier par php? si oui, comment faire communiquer la session PHP avec node? si non, alors une partie de ta logique ce trouve dans node et pas dans PHP. Ce n'est pas top.
    Pour les messages, a priori pas de différences avec les notifications.

    Pour les publications? outre le fait qu'il faut communiquer entre les deux serveurs et tout ce que cela comporte,admettons que tu reçoives la données via ws, et après? tu modifie le DOM avec jquery ou en js vanilla?!? autant passer sur une stack full JavaScript.

    Pour faire simple, si tu as un gros projet existant en PHP, et que tu souhaite ajouter un peu de temps réel, limite toi au minimum, sinon tu pars dans de la bidouille ou la galère de gérer deux serveurs distinct. Si non, full JavaScript.... et je dirais même que ce n'est pas évident de faire partager une session entre express.js et socket.io, c'est déjà une «bidouille» en soit (que je sache, la bidouille avec express3 ne fonctionne plus avec express4, depuis je n'ai pas suivi ce point).

  17. #17
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2012
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 73
    Points : 42
    Points
    42
    Par défaut
    Les notifications seraient du type comme facebook

    Mes publications, notifications et messages seraient créés avec ajax, donc entièrement avec javascript. Donc on peut essayer de faire ça uniquement avec le serveur node (module mysql de node) ? Sans passer par le serveur php.

    Je pourrais peut-être passer full javascript, mais ça consiste en quoi ?

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Je pourrais peut-être passer full javascript, mais ça consiste en quoi ?
    A créer à l'aide d'un framework js comme backbone/marionette, angular.js, react.js, aurelia.js, riot.js, ember.js, etc... etc... une application en JavaScript coté client (donc dans le navigateur), et qui dialogue via une api restfull ou les ws avec un serveur node. tu peux aussi regarder du coté de meteor et de mean.js. Il faudra aussi un framework coté serveur comme express.js, loopback.js, seals.js, koa.js, flatiron.js, etc... etc...

    Si tu ne connais pas, avec les mots clés que je viens de donner ci-avant, tu es parti pour des mois de découverte de nouveau concept (qui de plus évoluent sans cesse)

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    Mais pour info, facebook, c'est du long-polling (le lien est pris un peu au pif!)

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 154
    Points : 233
    Points
    233
    Par défaut
    faire partager une session entre express.js et socket.io, c'est déjà une «bidouille» en soit (que je sache, la bidouille avec express3 ne fonctionne plus avec express4, depuis je n'ai pas suivi ce point).
    Pour info, il semble qu'il y est du mieux avec express4 et socket.io 1 concernant les sessions http://stackoverflow.com/questions/2...ess-4-sessions

Discussions similaires

  1. Socket envoi pas tous les data
    Par toufik135 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 27/01/2014, 02h36
  2. Socket envoi message Client/Serveur
    Par sebkill dans le forum C#
    Réponses: 27
    Dernier message: 28/05/2008, 22h34
  3. [Socket] Creer Socket d'envoi UDP
    Par Metalman dans le forum Web & réseau
    Réponses: 0
    Dernier message: 20/11/2007, 23h14
  4. Socket, recv et select qui ne marche pas
    Par Zapan dans le forum Réseau
    Réponses: 18
    Dernier message: 30/06/2006, 20h19
  5. Réponses: 5
    Dernier message: 12/04/2006, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo