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

58

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

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

  • 0
    Извините, psiphi75, но эта ссылка не отвечает на мой ответ, не является дублирующим вопросом.
  • 1
    @ psiphi75, это ни в коем случае не дубликат
Показать ещё 5 комментариев
Теги:
socket.io

5 ответов

76
Лучший ответ

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

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

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" и читая данные, с которыми вы можете справиться, и откуда оно было отправлено.

  • 21
    Если вы используете это решение, вы должны понимать: 1. Когда пользователь отключается, вы должны очистить объект 'users' 2. Он не поддерживает второе соединение - например, из другого браузера. Поэтому, если пользователь подключается из другого браузера, старое подключение будет переопределено.
  • 1
    Как бы вы сохранили объект сокета в хранилище данных? Я предполагаю, что это не сработает, если у вас более одного процесса узла.
Показать ещё 9 комментариев
157

Вы можете использовать номера 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);
}

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

  • 0
    эта сторона клиента выглядит так, как будто бы она не привязана к конкретной комнате.
  • 0
    клиентская сторона не должна знать о комнатах, ваш сервер подписывает клиента на определенные комнаты. Клиенту просто нужно прослушивать события, а серверная сторона следит за тем, чтобы клиент получал события подписанных клиентом комнат.
Показать ещё 17 комментариев
11

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

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

  • 0
    это работает. Спасибо
  • 0
    Можете ли вы создать код на стороне клиента и на стороне сервера? Я новичок в программировании Scoket. [email protected]
Показать ещё 3 комментария
8

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

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

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

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

спасибо.

  • 0
    Привет, приятель, спасибо за твой первый ответ, я попробую и дам тебе знать об этом, потому что я не хочу создавать чат, а личный мессенджер, который ты можешь использовать в сети Facebook.
  • 0
    Может ли кто-нибудь помочь мне в этом вопросе, я действительно застрял, я хотел бы добавить имя пользователя, связанное с моим сокетом, и разрешить моему приложению отправлять сообщение определенному пользователю, без чата, это мессенджер, похожий на Facebook. Спасибо, если знаешь!
Показать ещё 3 комментария
1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню