Wysyłanie wiadomości do określonego ID w Socket.IO 1.0

85

Chcę wysłać dane do jednego określonego identyfikatora gniazda.

Kiedyś mogliśmy to robić w starszych wersjach:

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

Jak bym zrobił coś podobnego w Socket.IO 1.0?


źródło

Odpowiedzi:

206

W socket.io 1.0 zapewniają lepszy sposób na to. Każde gniazdo automatycznie dołącza do pokoju domyślnego według własnego identyfikatora. Sprawdź dokumenty: http://socket.io/docs/rooms-and-namespaces/#default-room

Możesz więc emitować do gniazda przez id z następującym kodem:

io.to(socketid).emit('message', 'for your eyes only');
Mustafa Dokumacı
źródło
Jest różnica między to (room_id) i (user_socket_id)? Właściwie używam go do wysyłania wiadomości do pokoju, który może mieć jednego lub więcej użytkowników. „Ułatwia to przesyłanie wiadomości do innych gniazd:”, a następnie może być jednym lub większą liczbą, a nie unikatowym gniazdem prywatnym.
Washington Botelho,
@WashingtonBotelho, identyfikatory gniazd zwykle wyglądają jak "Uj5CRqZ5b_Xubx9sAAAA", więc teoretycznie może być więcej niż jeden użytkownik w takim pomieszczeniu, ale w praktyce nie znam żadnych przypadków, w których dodałbym użytkownika do pokoju osobistego innego użytkownika.
Oleg
9
Jak możemy zidentyfikować konkretnego użytkownika na podstawie jego socketId, czy to oznacza, że ​​musimy gdzieś przechowywać parę klucz-wartość użytkownika (np.-Nazwa_użytkownika) i socketId?
Sai
@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/…
mahdi pishguy
To takie nielogiczne ... dlaczego po prostu nie udostępnisz nam sposobu na wysłanie wiadomości na numer identyfikacyjny gniazda i to wszystko? W każdym razie głosowano za, jedyne obejście, które faktycznie działa na 2.x
Adry
94

W socket.io 1.0 możesz to zrobić za pomocą następującego kodu:

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

Aktualizacja:

Odpowiedź @ MustafaDokumacı zawiera lepsze rozwiązanie.

Oleg
źródło
3
Różnica między tą odpowiedzią a wskazaną lepszą odpowiedzią polega na tym, że dzięki TEGO rozwiązaniu możesz mieć ładne wywołania zwrotne. Ale z io.to (socketid) NIE MOŻESZ używać wywołań zwrotnych.
Ramazan Polat
17

@Mustafa Dokumacı i @Curious dostarczyli już wystarczających informacji, dodaję, w jaki sposób można uzyskać identyfikator gniazda.

Aby uzyskać identyfikator gniazda, użyj socket.id :

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

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}
Dhiral Pandya
źródło
6

Jeśli korzystałeś z przestrzeni nazw, zauważyłem, że działa:

//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');

Więcej o przestrzeniach nazw: http://socket.io/docs/rooms-and-namespaces/

Met
źródło
5

Uważam, że zarówno @Curious, jak i @ MustafaDokumacı zapewniły rozwiązania, które działają dobrze. Różnica polega jednak na tym, że dzięki rozwiązaniu @ MustafaDokumacı wiadomość jest transmitowana do pokoju, a nie tylko do konkretnego klienta.

Różnica jest wyraźna, gdy wymagane jest potwierdzenie.

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

działa zgodnie z oczekiwaniami, podczas gdy

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

zawodzi z

Error: Callbacks are not supported when broadcasting
Giannis Kosmas
źródło
1

w Node.js -> socket.io -> jest przykład czatu do pobrania Wklej to w linii (io przy połączeniu) część .. używam tego kodu, który działa w 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
źródło