Отправка сообщения на определенный идентификатор в Socket.IO 1.0

85

Я хочу отправить данные на один конкретный идентификатор сокета.

Раньше мы могли это делать в более старых версиях:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

Как мне сделать что-то подобное в Socket.IO 1.0?


источник

Ответы:

206

В socket.io 1.0 они предоставляют лучший способ для этого. Каждый сокет автоматически присоединяется к комнате по умолчанию по собственному идентификатору. Проверьте документы: http://socket.io/docs/rooms-and-namespaces/#default-room

Таким образом, вы можете отправить в сокет по идентификатору со следующим кодом:

io.to(socketid).emit('message', 'for your eyes only');
Мустафа Докумачи
источник
Есть разница между to (room_id) и (user_socket_id)? На самом деле я использую его для отправки сообщения в комнату, в которой может быть один или несколько пользователей. «Это упрощает рассылку сообщений в другие сокеты:», тогда может быть один или несколько, а не уникальный частный.
Вашингтон Ботельо,
@WashingtonBotelho, идентификаторы сокетов обычно выглядят примерно как «Uj5CRqZ5b_Xubx9sAAAA», поэтому теоретически в такой комнате может быть более одного пользователя, но на практике я не знаю ни одного случая, когда я бы добавил пользователя в личную комнату другого пользователя.
Олег
9
Как мы можем идентифицировать конкретного пользователя по его socketId, означает ли это, что нам нужно где-то хранить пару значений ключа user (например, username) и socketId?
Сай
@Mustafa Dokumacı merhaba, bana bir gardenim et stackoverflow.com/questions/38817680/…
mahdi pishguy 07
Это так нелогично ... почему бы просто не предоставить нам способ отправить сообщение на номер идентификатора сокета и все? В любом случае проголосовало за, единственная работа, которая действительно работает на 2.x
Адри
94

В socket.io 1.0 это можно сделать с помощью следующего кода:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

Обновить:

Ответ @ MustafaDokumacı содержит лучшее решение.

Олег
источник
3
Разница между этим ответом и указанным лучшим ответом заключается в том, что с ЭТОМ решением вы можете иметь обратные вызовы, что приятно. Но с io.to (socketid) вы НЕ МОЖЕТЕ использовать обратные вызовы.
Рамазан Полат
17

@Mustafa Dokumacı и @Curious уже предоставили достаточно информации, я добавляю, как вы можете получить идентификатор сокета.

Чтобы получить идентификатор сокета, используйте socket.id :

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}
Дхирал Пандья
источник
6

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

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

Подробнее о пространствах имен: http://socket.io/docs/rooms-and-namespaces/

Мет
источник
5

Я считаю, что и @Curious, и @ MustafaDokumacı предоставили решения, которые работают хорошо. Однако разница в том, что с решением @ MustafaDokumacı сообщение транслируется в комнату, а не только конкретному клиенту.

Разница заметна, когда запрашивается подтверждение.

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

работает как положено, а

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

терпит неудачу с

Error: Callbacks are not supported when broadcasting
Яннис Космас
источник
1

в Node.js -> socket.io -> есть пример чата для загрузки Вставьте это в строку (io при подключении). Я использую этот код, который работает на 100%

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
user2204339
источник