Я начинаю с socket.io + node.js, я знаю, как отправить сообщение локально и передать функцию socket.broadcast.emit()
: - все подключенные клиенты получают одно и то же сообщение.
Теперь я хотел бы знать, как отправить личное сообщение конкретному клиенту, я имею в виду один сокет для частного чата между двумя людьми (потоком клиент-клиент). Спасибо.
Когда пользователь подключается, он должен отправить сообщение на сервер с именем пользователя, которое должно быть уникальным, например, по электронной почте.
Пара имени пользователя и сокета должна храниться в объекте, подобном этому:
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" и читая данные, с которыми вы можете справиться, и откуда оно было отправлено.
Вы можете использовать номера 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);
}
Надеюсь, у вас есть идея.
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);
});
Надеюсь, что это хорошо работает для вас. Удачи
Вы можете обратиться к socket.io rooms. Когда вы сочтете сокет - вы можете присоединиться к нему в названном помещении, например "пользователь. # {Userid}".
После этого вы можете отправить личное сообщение любому клиенту с помощью удобного имени, например:
io.sockets.in('user.125'). emit ('new_message', {text: "Hello world" })
В операции выше мы отправляем "new_message" пользователю "125".
спасибо.
В проекте нашей компании мы используем подход "комнаты", и это имя представляет собой комбинацию идентификаторов пользователей всех пользователей в разговоре как уникальный идентификатор (наша реализация больше похожа на facebook messenger), например:
| id | имя | 1 | Скотт | 2 | Susan
"room" name будет "1-2" (идентификаторы заказаны Asc.), а при отключении socket.io автоматически очищает комнату.
таким образом вы отправляете сообщения только в эту комнату и только в онлайн (подключенные) пользователи (меньше пакетов, отправленных по всему серверу).