Отправка сообщения конкретному клиенту в Socket IO

Я использую Socket IO v1.4.5 и пробовал 3 разных способа, но не получил никакого результата.

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

Вот моя серверная сторона

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');
});

Любая помощь будет отличной. Спасибо за помощь. Обратите внимание

Ответ 1

Чтобы отправить сообщение конкретному клиенту, вам нужно сделать это так:

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

Вот хороший маленький обманщик для сокетов:

 // 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');

Кредит fooobar.com/questions/36193/...


Самый простой способ, а не отправка непосредственно в сокет, - это создать комнату для использования 2 пользователями и просто отправлять туда сообщения.

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.

В противном случае вам нужно будет отслеживать каждое соединение сокетов отдельных клиентов, и когда вы хотите общаться в чате, вам придется искать это соединение сокетов и выделять специально для этого, используя функцию, указанную выше. Комнаты, вероятно, проще.

Ответ 2

Вы можете использовать это, чтобы отправить сообщение определенному клиенту

socket.emit('message', "this is a test");

Ответ 3

Socket.io Версия 2.0.3 +

Отправка сообщения в конкретный сокет

    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");
    }

Ответ 4

Просто сделайте это

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