Senden einer Nachricht an eine bestimmte ID in Socket.IO 1.0

84

Ich möchte Daten an eine bestimmte Socket-ID senden.

Früher konnten wir dies in älteren Versionen tun:

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

Wie würde ich in Socket.IO 1.0 etwas Ähnliches tun?


quelle

Antworten:

205

In socket.io 1.0 bieten sie dafür einen besseren Weg. Jeder Socket wird automatisch über seine eigene ID einem Standardraum zugeordnet. Überprüfen Sie die Dokumente: http://socket.io/docs/rooms-and-namespaces/#default-room

Sie können also per ID mit folgendem Code an einen Socket senden:

io.to(socketid).emit('message', 'for your eyes only');
Mustafa Dokumacı
quelle
Gibt es einen Unterschied zwischen (room_id) und (user_socket_id)? Ich verwende es tatsächlich, um eine Nachricht an einen Raum zu senden, der einen oder mehrere Benutzer haben kann. "Dies macht es einfach, Nachrichten an andere Sockets zu senden:", kann dann eine oder mehrere sein, keine eindeutige private.
Washington Botelho
@WashingtonBotelho, Socket-IDs sehen normalerweise wie "Uj5CRqZ5b_Xubx9sAAAA" aus. Theoretisch gibt es möglicherweise mehr als einen Benutzer in einem solchen Raum, aber in der Praxis kenne ich keine Fälle, in denen ich einen Benutzer zum persönlichen Raum eines anderen Benutzers hinzufügen würde.
Oleg
8
Wie können wir einen bestimmten Benutzer anhand seiner Socket-ID identifizieren? Bedeutet dies, dass wir irgendwo ein Schlüsselwertpaar aus Benutzer (z. B. Benutzername) und Socket-ID speichern müssen?
Sai
@ Mustafa Dokumacı Merhaba,
Bana Bir
Es ist einfach so unlogisch ... warum bieten wir uns nicht einfach die Möglichkeit, eine Nachricht an eine Socket-ID-Nummer zu senden, und das war's? Wie auch immer, die einzige Lösung, die tatsächlich auf 2.x funktioniert
Adry
94

In socket.io 1.0 können Sie dies mit folgendem Code tun:

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

Aktualisieren:

@ MustafaDokumacıs Antwort enthält eine bessere Lösung.

Oleg
quelle
3
Der Unterschied zwischen dieser Antwort und einer gezielten besseren Antwort besteht darin, dass Sie mit DIESER Lösung Rückrufe erhalten können, was sehr hilfreich ist. Mit io.to (Socketid) können Sie jedoch keine Rückrufe verwenden.
Ramazan Polat
17

@Mustafa Dokumacı und @Curious haben bereits genügend Informationen bereitgestellt. Ich füge hinzu, wie Sie die Socket-ID erhalten können.

Um die Socket-ID zu erhalten, verwenden Sie socket.id :

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

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}
Dhiral Pandya
quelle
6

Wenn Sie einen Namespace verwendet haben, stellte ich fest, dass Folgendes funktioniert:

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

Weitere Informationen zu Namespaces: http://socket.io/docs/rooms-and-namespaces/

Meth
quelle
5

Ich glaube, dass sowohl @Curious als auch @ MustafaDokumacı Lösungen geliefert haben, die gut funktionieren. Der Unterschied besteht jedoch darin, dass mit der Lösung von @ MustafaDokumacı die Nachricht an einen Raum und nicht nur an einen bestimmten Kunden gesendet wird.

Der Unterschied ist deutlich, wenn eine Bestätigung angefordert wird.

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

funktioniert wie erwartet, während

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

scheitert mit

Error: Callbacks are not supported when broadcasting
Giannis Kosmas
quelle
1

in Node.js -> socket.io -> gibt es ein Chat-Beispiel zum Herunterladen Einfügen in Zeile (io bei Verbindung) Teil .. Ich verwende diesen Code, der 100% funktioniert

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
quelle