Как отправить сообщение конкретному клиенту с помощью socket.io

Я начинаю с socket.io + node.js, я знаю, как отправить сообщение локально и передать функцию socket.broadcast.emit(): - все подключенные клиенты получают одно и то же сообщение.

Теперь я хотел бы знать, как отправить личное сообщение конкретному клиенту, я имею в виду один сокет для частного чата между двумя людьми (потоком клиент-клиент). Спасибо.

Ответ 1

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

Пара имени пользователя и сокета должна храниться в объекте, подобном этому:

var users = {
    '[email protected]': [socket object],
    '[email protected]': [socket object],
    '[email protected]': [socket object]
}

На клиенте выпустите объект на сервер со следующими данными:

{
    to:[the other receiver username as a string],
    from:[the person who sent the message as string],
    message:[the message to be sent as string]
}

На сервере прослушивайте сообщения. Когда сообщение получено, испустите данные в приемник.

users[data.to].emit('receivedMessage', data)

На клиенте слушайте испускания с сервера с именем "receivedMessage" и читая данные, с которыми вы можете справиться, и откуда оно было отправлено.

Ответ 2

Вы можете использовать номера socket.io. С клиентской стороны испускать событие ( "join" в этом случае может быть любым) с любым уникальным идентификатором (email, id).

Сторона клиента:

var socket = io.connect('http://localhost');
socket.emit('join', {email: [email protected]});

Теперь, со стороны сервера, используйте эту информацию, чтобы создать уникальную комнату для этого пользователя.

Сторона сервера:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('join', function (data) {
    socket.join(data.email); // We are using room of socket io
  });
});

Итак, теперь каждый пользователь присоединился к комнате, названной по электронной почте пользователя. Поэтому, если вы хотите отправить конкретному пользователю сообщение, которое вам нужно просто

Сторона сервера:

io.sockets.in('[email protected]').emit('new_msg', {msg: 'hello'});

Последнее, что осталось сделать на стороне клиента, - это прослушать событие "new_msg".

Сторона клиента:

socket.on("new_msg", function(data) {
    alert(data.msg);
}

Надеюсь, у вас есть идея.

Ответ 3

SURE: Проще говоря,

Это то, что вам нужно:

io.to(socket.id).emit("event", data);

всякий раз, когда пользователь присоединяется к серверу, будут генерироваться сведения о сокетах, включая идентификатор. Это идентификатор действительно помогает отправить сообщение конкретным людям.

сначала нам нужно сохранить все сокеты в массиве,

var people={};

people[name] =  socket.id;

здесь имя - имя получателя. Пример:

people["ccccc"]=2387423cjhgfwerwer23;

Итак, теперь мы можем получить этот socket.id с именем получателя всякий раз, когда мы отправляем сообщение:

для этого нам нужно знать recievername. Вам нужно выпустить имя приемника на сервер.

Последняя вещь:

 socket.on('chat message', function(data){
io.to(people[data.reciever]).emit('chat message', data.msg);
});

Надеюсь, что это хорошо работает для вас. Удачи

Ответ 4

Вы можете обратиться к socket.io rooms. Когда вы сочтете сокет - вы можете присоединиться к нему в названном помещении, например "пользователь. # {Userid}".

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

io.sockets.in('user.125'). emit ('new_message', {text: "Hello world" })

В операции выше мы отправляем "new_message" пользователю "125".

спасибо.

Ответ 5

В проекте нашей компании мы используем подход "комнаты", и это имя представляет собой комбинацию идентификаторов пользователей всех пользователей в разговоре как уникальный идентификатор (наша реализация больше похожа на facebook messenger), например:

| id | имя | 1 | Скотт | 2 | Susan

"room" name будет "1-2" (идентификаторы заказаны Asc.), а при отключении socket.io автоматически очищает комнату.

таким образом вы отправляете сообщения только в эту комнату и только в онлайн (подключенные) пользователи (меньше пакетов, отправленных по всему серверу).