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?

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

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.


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);  
}

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/


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

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);
  });
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.