Je travaille avec socket.io et node.js et jusqu'à présent, cela semble assez bon, mais je ne sais pas comment envoyer un message du serveur à un client spécifique, quelque chose comme ceci:
client.send(message, receiverSessionId)
Mais .send()
ni les .broadcast()
méthodes ni les méthodes ne semblent répondre à mes besoins.
Ce que j'ai trouvé comme solution possible, c'est que la .broadcast()
méthode accepte comme deuxième paramètre un tableau de SessionIds auquel ne pas envoyer le message, donc je pourrais passer un tableau avec tous les SessionIds connectés à ce moment au serveur, sauf celui Je souhaite envoyer le message, mais j'estime qu'il doit y avoir une meilleure solution.
Des idées?
la source
La réponse d'Ivo Wetzel ne semble plus être valide dans Socket.io 0.9.
En bref, vous devez maintenant enregistrer le
socket.id
et l'utiliserio.sockets.socket(savedSocketId).emit(...)
pour lui envoyer des messages.Voici comment cela fonctionne sur le serveur Node.js en cluster:
Vous devez d'abord définir le magasin Redis comme magasin afin que les messages puissent traverser les processus:
J'ai omis le code de clustering ici, car cela rend cela plus encombré, mais c'est trivial à ajouter. Ajoutez simplement tout au code de travail. Plus de documentation ici http://nodejs.org/api/cluster.html
la source
io.of('/mynamespace').sockets[socketID].emit(...)
(je ne sais pas si c'est parce que j'utilise un espace de noms)io.sockets.socket(socket_id)
est supprimé dans socket.io 1.0. github.com/socketio/socket.io/issues/1618#issuecomment-46151246chaque socket rejoint une pièce avec un identifiant de socket pour un nom, vous pouvez donc simplement
docs: http://socket.io/docs/rooms-and-namespaces/#default-room
À votre santé
la source
io.sockets.connected[socketid].emit();
. Testé avec 1.4.6.La solution la plus simple et la plus élégante
C'est aussi simple que:
Et c'est tout.
Mais comment? Donne moi un exemple
Ce dont nous avons tous besoin, c'est en fait un exemple complet, et c'est ce qui suit. Ceci est testé avec la version la plus récente de socket.io (2.0.3) et utilise également du Javascript moderne (que nous devrions tous utiliser maintenant).
L'exemple est composé de deux parties: un serveur et un client. Chaque fois qu'un client se connecte, il commence à recevoir du serveur un numéro de séquence périodique. Une nouvelle séquence est lancée pour chaque nouveau client, le serveur doit donc les suivre individuellement. C'est là qu'entre en jeu le "J'ai besoin d'envoyer un message à un client particulier" . Le code est très simple à comprendre. Voyons ça.
Serveur
server.js
Le serveur commence à écouter sur le port 8000 les connexions entrantes. Quand on arrive, il ajoute ce nouveau client à une carte afin qu'il puisse garder une trace de son numéro de séquence. Il écoute également l'
disconnect
événement de ce client , quand il le supprimera de la carte.Chaque seconde, une minuterie est déclenchée. Lorsque c'est le cas, le serveur parcourt la carte et envoie un message à chaque client avec son numéro de séquence actuel. Il l'incrémente ensuite et enregistre le numéro dans la carte. C'est tout ce qu'il y a à faire. Peasy facile.
Client
La partie client est encore plus simple. Il se connecte simplement au serveur et écoute le
seq-num
message, l'imprimant sur la console à chaque fois qu'il arrive.client.js
Exécuter l'exemple
Installez les bibliothèques requises:
Exécutez le serveur:
Ouvrez d'autres fenêtres de terminal et créez autant de clients que vous le souhaitez en exécutant:
J'ai également préparé un résumé avec le code complet ici .
la source
Vous pouvez utiliser
// envoyer le message uniquement à l'expéditeur-client
socket.emit('message', 'check this');
// ou vous pouvez envoyer à tous les écouteurs, y compris l'expéditeur
io.emit('message', 'check this');
// envoyer à tous les écouteurs sauf l'expéditeur
socket.broadcast.emit('message', 'this is a message');
// ou vous pouvez l'envoyer dans une salle
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
la source
Dans la version 1.0, vous devez utiliser:
la source
io.sockets.connected["something"]
et saemit
méthode.Quelle que soit la version que nous utilisons si nous utilisons simplement console.log () l'objet "io" que nous utilisons dans notre code nodejs côté serveur, [par exemple io.on ('connection', function (socket) {...});] , nous pouvons voir que "io" est juste un objet json et il y a de nombreux objets enfants où les objets id et socket sont stockés.
J'utilise socket.io version 1.3.5, btw.
Si nous regardons dans l'objet io, il contient,
ici nous pouvons voir les socketids "B5AC9w0sYmOGWe4fAAAA" etc. Donc, nous pouvons faire,
Encore une fois, après une inspection plus approfondie, nous pouvons voir des segments comme,
Ainsi, nous pouvons récupérer une socket à partir d'ici en faisant
Aussi, sous le moteur, nous avons,
Donc, on peut aussi écrire,
Donc, je suppose que nous pouvons atteindre notre objectif de l'une des 3 façons que j'ai énumérées ci-dessus,
la source
Tu peux le faire
Sur le serveur.
Et sur le client, c'est très facile à manipuler.
la source
À partir de la version 1.4.5, assurez-vous de fournir un socketId correctement préfixé dans io.to (). Je prenais le socketId que le client avait connecté pour déboguer et il était sans préfixe, alors j'ai fini par chercher pour toujours jusqu'à ce que je le découvre! Vous devrez peut-être le faire comme ceci si l'identifiant que vous avez n'est pas préfixé:
la source
io.sockets.sockets [socket.id] .emit (...) a fonctionné pour moi dans la v0.9
la source
Vous pouvez également conserver les références des clients. Mais cela rend votre mémoire occupée.
Créez un objet vide et placez-y vos clients.
puis appelez votre client spécifique par identifiant depuis l'objet
la source
Socket.IO vous permet d '«espace de noms» vos sockets, ce qui signifie essentiellement l'attribution de différents points de terminaison ou chemins.
Cela pourrait aider: http://socket.io/docs/rooms-and-namespaces/
la source