2014-06-05 3 views
0

Je dois obtenir une instance de socket dans ma requête ajax sur le serveur dans le module node.js. Voici mon code.Obtenir l'instance de socket sur le serveur

app.js

io.set('authorization', function (handshake, callback) { 
    if (handshake.headers.cookie) { 
     cookieParser(handshake, null, function(err) { 
      handshake.sessionID = handshake.signedCookies['express.sid']; 
     }); 
    } else { return callback('No cookie transmitted.', false); } 
}); 

io.sockets.on('connection', function(socket) { 
    var session = socket.handshake.session; 
    var userid = session.userid; 
    socket.join("room"); 
    //make user offline 

    socket.on('disconnect', function() { 
     //my code goes here... 
     //make user offline 
    }) 
}); 

Maintenant, dans l'une de ma demande ajax, je veux par exemple socket

app.post('/logout', function (req, res) { 
    //here i want socket instance, so I can emit message to all socket, accept this. 
}); 

Comme je sais, chaque onglet crée sa propre nouvelle connexion socket, mais la session est unique entre tous les onglets du navigateur. Donc, comment puis-je stocker socket pour chaque onglet sur le côté serveur, où je peux trouver facilement l'instance de socket, puis diffuser le message à toutes les sockets, à l'exclusion de ce socket qui crée des événements. (signifie la connexion socket de l'onglet actif de l'utilisateur)

grâce

Répondre

1

Dans mon application, je peux faire ce que vous dites parce que je l'utilise espace de nom et chambre et donc dans une salle que je peux trouver chaque prise de quelqu'un.

Afin que je puisse retirer chaque socket de l'utilisateur. Mais si vous ne pouvez pas l'utiliser, je pense que dans votre application, vous devrez implémenter outside.io une classe pour quelqu'un (en utilisant la session pour voir si une socket est déjà ouverte ou si vous devez créer une nouvelle instance) . Et dans cette classe, ayez une table de douille de sorte que vous puissiez manipuler la douille de quelqu'un.

Dans mon cas, je fais la même chose sauf que j'utilise la room de socket.io pour le faire.

Et de diffuser à chaque socket, cela dépend quelle est votre application. Si votre application envoie à quelqu'un dans le même espace de noms, cela ne change rien parce que le socket de la même session recevra également le message. Mais sinon, vous devrez implémenter une fonction pour émettre sur chaque socket de la table que j'ai suggéré plus haut. Dans mon cas, j'utilise l'option 'exclude' pour m'assurer que le socket actuel ne reçoit pas le message mais que vous pouvez généralement utiliser broadcast.

io.of('/user').in(this.id).except(socket.id).emit('msg', { text: text,type:person}); 

Pour conclure, socket.io ne vous aidera pas à gérer la session et plusieurs socket pour un utilisateur/session, mais vous pouvez gérer pour y faire face en utilisant la fonction de chambre (dans mon cas, il était le meilleur moyen), ou implémentez une classe d'utilisateurs où vous allez gérer une table de vos sockets de session.

Questions connexes