2013-07-04 6 views
62

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

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

+0

Извините psiphi75, но эта ссылка не отвечает на мой ответ, это не дублирующий вопрос. –

+1

@ psiphi75, это не дубликат – softvar

+1

Не выдерживают таких людей, как @psiphi. Вы даже разработчик? Как конкретный вопрос HTML5 относится к автономной библиотеке? И для чего это стоит, WebSockets НЕ Socket.io. Socket.io - это библиотека, которая может использовать WebSockets, но я отвлекаюсь. Это также более конкретный вопрос, связанный с библиотекой по отправке данных только конкретным клиентам, а не самой технологии. –

ответ

74

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

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

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

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

{ 
    to:[the other receiver's 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», и путем считывания данных вы можете справиться, кто это пришло и сообщение, которое было отправлено.

+18

Если вы используете это решение, то вы должны понимать: 1. Когда пользователь отключается, вы должны очистить объект «Пользователи» 2. Он не поддерживает второе соединение - например, из другого браузера. Поэтому, если пользователь подключится из другого браузера, старое соединение будет переопределено. –

+1

Как бы вы сохранили объект сокета в хранилище данных? Я предполагаю, что это не работает, если у вас есть несколько процессов узла. – chovy

+0

@chovy вы должны использовать redis. Проверьте это https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO –

8

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

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

io.sockets.in ('user.125') испускают ('new_message', {Текст.: «Hello world»})

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

спасибо.

+0

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

+0

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

+0

Сначала вы должны понимать, что это имя пользователя должно быть уникальным для всех пользователей. А вторая - не забыли ли вы подписаться на выпущенное сообщение на стороне клиента? –

172

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

, что клиентская сторона выглядит так, как будто она не привязана к определенной комнате. – chovy

+0

стороне клиента не нужно знать о комнатах, ваш сервер подписывает вашего клиента на определенные номера. Клиент просто должен прослушивать события, а серверная сторона гарантирует, что клиент получит события в подписных комнатах клиента. – az7ar

+2

измените эту строку io.socket.in ('[email protected] '). Emit (' new_msg ', {msg:' hello '}); например, io.sockets.in ('[email protected] '). emit (' new_msg ', {msg:' hello '}); – silvesterprabu

1

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

| ID | наименование | 1 | Скотт | 2 | Susan

название «номер» будет «1-2» (Идентификаторы упорядочены Asc.) И отключение socket.io автоматически очищает комнату

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

15

SURE: Просто

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

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

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

сначала мы должны хранить все socket.ids в массиве,

var people={}; 

people[name] = socket.id; 

здесь называют это имя приемника. Пример:

people["ccccc"]=2387423cjhgfwerwer23; 

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

для этого нам нужно знать receivername. Вам необходимо указать имя получателя на сервер.

окончательная вещь:

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

Надежда это хорошо работает для вас.

Удачи !!

+0

это работает. Спасибо – yasiriqbal776

+0

Можете ли вы создать код на стороне клиента и на стороне сервера.? Я новичок в программировании scoket. [email protected] –

+0

@HARISH, см. ссылку ниже, объясняет, что на самом деле происходит с клиентской стороны. Надеюсь, это поможет вам больше ..http: //socket.io/get-started/chat/ – Trojan

Смежные вопросы