web-dev-qa-db-fra.com

Envoi de message à un client spécifique dans Socket IO

J'utilise Socket IO v1.4.5 et j'ai essayé 3 manières différentes ci-dessous mais je n'ai aucun résultat.

client.emit('test', 'hahahaha');
io.sockets.socket(id).emit('test',''hahaha); 
io.sockets.connected[id].emit('test','hahaha');

Voici mon côté serveur

var socket = require( 'socket.io' );
var express = require( 'express' );
var http = require( 'http' );
var dateFormat = require('date-format');
var app = express();
var server = http.createServer( app );
var io = socket.listen( server );
io.sockets.on( 'connection', function( client ) {
    user[client.id]=client;

//when we receive message 
    client.on('message', function( data ) {
        console.log( 'Message received from' + data.name + ":" + data.message +' avatar' +data.avatar );
        client.emit('test', 'hahahaha');
});

Toute aide serait formidable.Merci de l'aide.Kind Regard

17
Ngô Hùng Phúc

Pour envoyer un message à un client spécifique, vous devez le faire comme suit:

socket.broadcast.to(socketid).emit('message', 'for your eyes only');

Voici un joli petit aide-mémoire pour les sockets:

 // sending to sender-client only
 socket.emit('message', "this is a test");

 // sending to all clients, include sender
 io.emit('message', "this is a test");

 // sending to all clients except sender
 socket.broadcast.emit('message', "this is a test");

 // sending to all clients in 'game' room(channel) except sender
 socket.broadcast.to('game').emit('message', 'Nice game');

 // sending to all clients in 'game' room(channel), include sender
 io.in('game').emit('message', 'cool game');

 // sending to sender client, only if they are in 'game' room(channel)
 socket.to('game').emit('message', 'enjoy the game');

 // sending to all clients in namespace 'myNamespace', include sender
 io.of('myNamespace').emit('message', 'gg');

 // sending to individual socketid
 socket.broadcast.to(socketid).emit('message', 'for your eyes only');

Crédit à https://stackoverflow.com/a/10099325


Le moyen le plus simple, plutôt que d’envoyer directement au socket, serait de créer une pièce à utiliser pour les 2 utilisateurs et d’envoyer simplement des messages librement.

socket.join('some-unique-room-name'); // Do this for both users you want to chat with each other
socket.broadcast.to('the-unique-room-name').emit('message', 'blah'); // Send a message to the chat room.

Sinon, vous devrez garder une trace de la connexion de socket de chaque client, et lorsque vous voulez discuter, vous devez rechercher cette connexion de sockets et émettre spécifiquement vers celle-ci en utilisant la fonction que j'ai décrite ci-dessus. Les chambres sont probablement plus faciles.

93
Datsik

Faites ceci simplement 

io.socket.in('room').emit("send message to everyone", data);
0
Muhammad Awais

Socket.io Version 2.0.3+

Envoi d'un message à un socket spécifique

    let namespace = null;
    let ns = _io.of(namespace || "/");
    let socket = ns.connected[socketId] // assuming you have  id of the socket
    if (socket) {
        console.log("Socket Connected, sent through socket");
        socket.emit("chatMessage", data);
    } else {
        console.log("Socket not connected, sending through Push notification");
    }
0
partikles