Я работаю с socket.io и node.js, и до сих пор это кажется довольно хорошим, но я не знаю, как отправить сообщение с сервера конкретному клиенту, что-то вроде этого:
client.send(message, receiverSessionId)
Но ни метод, .send()
ни .broadcast()
методы, кажется, не удовлетворяют мою потребность.
Что я нашел в качестве возможного решения, так это то, что .broadcast()
метод принимает в качестве второго параметра массив SessionIds, на который не отправляется сообщение, поэтому я мог бы передать массив со всеми SessionIds, подключенными в этот момент к серверу, кроме одного Я хотел бы отправить сообщение, но я чувствую, что должно быть лучшее решение.
Любые идеи?
источник
Ответ Ivo Wetzel больше не подходит для Socket.io 0.9.
Короче говоря, теперь вы должны сохранить
socket.id
и использоватьio.sockets.socket(savedSocketId).emit(...)
для отправки сообщений на него.Вот как у меня это работает на кластерном сервере Node.js:
Сначала вам нужно установить хранилище Redis как хранилище, чтобы сообщения могли проходить через процессы:
Я опустил код кластеризации здесь, потому что это делает его более загроможденным, но добавить его тривиально. Просто добавьте все в рабочий код. Больше документов здесь http://nodejs.org/api/cluster.html
источник
io.of('/mynamespace').sockets[socketID].emit(...)
(не знаю, потому что я использую пространство имен)io.sockets.socket(socket_id)
удаляется в socket.io 1.0. github.com/socketio/socket.io/issues/1618#issuecomment-46151246каждый сокет объединяет комнату с идентификатором сокета для имени, так что вы можете просто
документы: http://socket.io/docs/rooms-and-namespaces/#default-room
ура
источник
io.sockets.connected[socketid].emit();
. Протестировано с 1.4.6.Самое простое, самое элегантное решение
Это так же просто, как:
И это все.
Но как? Приведи пример
То, что нам всем нужно, это на самом деле полный пример, и вот что следует. Это протестировано с самой последней версией socket.io (2.0.3), а также с использованием современного Javascript (который мы все должны сейчас использовать).
Пример состоит из двух частей: сервера и клиента. Каждый раз, когда клиент подключается, он начинает получать от сервера периодический порядковый номер. Новая последовательность запускается для каждого нового клиента, поэтому сервер должен отслеживать их индивидуально. Вот тут-то и вступает в игру «Мне нужно отправить сообщение конкретному клиенту» . Код очень прост для понимания. Давай увидим это.
сервер
server.js
Сервер начинает прослушивать порт 8000 для входящих соединений. Когда он прибывает, он добавляет этого нового клиента на карту, чтобы он мог отслеживать его порядковый номер. Он также прослушивает
disconnect
событие этого клиента , когда удалит его с карты.Каждую секунду срабатывает таймер. Когда это происходит, сервер просматривает карту и отправляет каждому клиенту сообщение с его текущим порядковым номером. Затем он увеличивает его и сохраняет номер обратно на карте. Вот и все, что нужно сделать. Очень просто.
клиент
Клиентская часть еще проще. Он просто подключается к серверу и прослушивает
seq-num
сообщение, распечатывая его на консоли каждый раз, когда оно приходит.client.js
Выполнение примера
Установите необходимые библиотеки:
Запустите сервер:
Откройте другие окна терминала и создайте столько клиентов, сколько вы хотите, запустив:
Я также подготовил суть с полным кодом здесь .
источник
Ты можешь использовать
// отправляем сообщение только отправителю-клиенту
socket.emit('message', 'check this');
// или вы можете отправить всем слушателям, включая отправителя
io.emit('message', 'check this');
// отправить всем слушателям кроме отправителя
socket.broadcast.emit('message', 'this is a message');
// или вы можете отправить его в комнату
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
источник
В 1.0 вы должны использовать:
источник
io.sockets.connected["something"]
и егоemit
метода.Какую бы версию мы не использовали, если мы просто console.log () будем использовать объект "io", который мы используем в нашем коде nodejs на стороне сервера, [например, io.on ('connection', function (socket) {...});] мы можем видеть, что «io» - это просто объект json, и есть много дочерних объектов, в которых хранятся объекты сокета id и сокета.
Я использую socket.io версии 1.3.5, кстати.
Если мы посмотрим на объект io, он содержит,
здесь мы можем увидеть сокеты "B5AC9w0sYmOGWe4fAAAA" и т. д. Итак, мы можем сделать,
Опять же, при дальнейшей проверке мы можем увидеть такие сегменты, как,
Итак, мы можем получить сокет отсюда, выполнив
Кроме того, под двигателем мы имеем,
Итак, мы также можем написать,
Итак, я думаю, что мы можем достичь нашей цели любым из трех способов, которые я перечислил выше,
источник
Ты можешь сделать это
На сервере.
А на клиенте это очень просто.
источник
Начиная с версии 1.4.5, убедитесь, что в io.to () указан правильный префикс socketId. Я брал socketId, в который Клиент вошел для отладки, и он был без префикса, поэтому я продолжал искать вечно, пока не узнал! Так что вам, возможно, придется сделать это следующим образом, если у вашего идентификатора нет префикса:
источник
io.sockets.sockets [socket.id] .emit (...) работал для меня в v0.9
источник
Также вы можете сохранить отзывы клиентов. Но это делает вашу память занятой.
Создайте пустой объект и установите в него своих клиентов.
затем позвоните конкретному клиенту по идентификатору из объекта
источник
Socket.IO позволяет вам «именовать» свои сокеты, что по сути означает назначение различных конечных точек или путей.
Это может помочь: http://socket.io/docs/rooms-and-namespaces/
источник