Ich arbeite mit socket.io und node.js und bis jetzt scheint es ziemlich gut zu sein, aber ich weiß nicht, wie ich eine Nachricht vom Server an einen bestimmten Client senden soll, ungefähr so:
client.send(message, receiverSessionId)
Aber weder die .send()
noch die .broadcast()
Methoden scheinen mein Bedürfnis zu befriedigen.
Als mögliche Lösung habe ich festgestellt, dass die .broadcast()
Methode als zweiten Parameter ein Array von SessionIds akzeptiert, an die die Nachricht nicht gesendet wird, sodass ich ein Array mit allen zu diesem Zeitpunkt verbundenen SessionIds an den Server übergeben kann, mit Ausnahme des einen Ich möchte die Nachricht senden, aber ich denke, es muss eine bessere Lösung geben.
Irgendwelche Ideen?
quelle
Die Antwort von Ivo Wetzel scheint in Socket.io 0.9 nicht mehr gültig zu sein.
Kurz gesagt, Sie müssen das jetzt speichern
socket.id
und verwendenio.sockets.socket(savedSocketId).emit(...)
, um Nachrichten an es zu senden.So habe ich das auf dem Clustered Node.js Server zum Laufen gebracht:
Zuerst müssen Sie den Redis-Speicher als Speicher festlegen, damit Nachrichten prozessübergreifend ausgeführt werden können:
Ich habe den Clustering-Code hier weggelassen, weil er dadurch unübersichtlicher wird, aber das Hinzufügen ist trivial. Fügen Sie einfach alles zum Worker-Code hinzu. Weitere Dokumente finden Sie hier http://nodejs.org/api/cluster.html
quelle
io.of('/mynamespace').sockets[socketID].emit(...)
(weiß nicht, ob es daran liegt, dass ich einen Namespace verwende)io.sockets.socket(socket_id)
wird in socket.io 1.0 entfernt. github.com/socketio/socket.io/issues/1618#issuecomment-46151246Jeder Socket verbindet einen Raum mit einer Socket-ID für einen Namen, sodass Sie dies einfach tun können
Dokumente: http://socket.io/docs/rooms-and-namespaces/#default-room
Prost
quelle
io.sockets.connected[socketid].emit();
. Getestet mit 1.4.6.Die einfachste und eleganteste Lösung
Es ist so einfach wie:
Und das ist es.
Aber wie? Gib mir ein Beispiel
Was wir alle brauchen, ist in der Tat ein vollständiges Beispiel, und das folgt. Dies wird mit der neuesten socket.io-Version (2.0.3) getestet und es wird auch modernes Javascript verwendet (das wir jetzt alle verwenden sollten).
Das Beispiel besteht aus zwei Teilen: einem Server und einem Client. Immer wenn ein Client eine Verbindung herstellt, erhält er vom Server eine periodische Sequenznummer. Für jeden neuen Client wird eine neue Sequenz gestartet, sodass der Server diese einzeln verfolgen muss. Hier kommt das "Ich muss eine Nachricht an einen bestimmten Kunden senden" ins Spiel. Der Code ist sehr einfach zu verstehen. Mal sehen.
Server
server.js
Der Server überwacht Port 8000 auf eingehende Verbindungen. Wenn einer ankommt, fügt er diesen neuen Client einer Karte hinzu, damit er seine Sequenznummer verfolgen kann. Es hört auch auf diesen Kunden
disconnect
Ereignis , wenn es von der Karte entfernt wird.Jede Sekunde wird ein Timer ausgelöst. In diesem Fall durchläuft der Server die Karte und sendet an jeden Client eine Nachricht mit der aktuellen Sequenznummer. Es erhöht es dann und speichert die Nummer wieder in der Karte. Das ist alles was dazu gehört. Kinderleicht.
Klient
Der Client-Teil ist noch einfacher. Es stellt lediglich eine Verbindung zum Server her, wartet auf die
seq-num
Nachricht und druckt sie bei jedem Eintreffen auf der Konsole aus.client.js
Beispiel ausführen
Installieren Sie die erforderlichen Bibliotheken:
Führen Sie den Server aus:
Öffnen Sie andere Terminalfenster und erzeugen Sie so viele Clients, wie Sie möchten, indem Sie Folgendes ausführen:
Ich habe auch bereit , einen Kern mit dem vollständigen Code hier .
quelle
Sie können verwenden
// Nachricht nur an Absender-Client senden
socket.emit('message', 'check this');
// oder Sie können an alle Listener einschließlich des Absenders senden
io.emit('message', 'check this');
// an alle Listener außer dem Absender senden
socket.broadcast.emit('message', 'this is a message');
// oder du kannst es in einen Raum schicken
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
quelle
In 1.0 sollten Sie verwenden:
quelle
io.sockets.connected["something"]
und seineemit
Methode gibt.Welche Version wir auch verwenden, wenn wir nur console.log () das "io" -Objekt verwenden, das wir in unserem serverseitigen nodejs-Code verwenden, [z. B. io.on ('connection', function (socket) {...});] können wir sehen, dass "io" nur ein JSON-Objekt ist und es viele untergeordnete Objekte gibt, in denen die Socket-ID und die Socket-Objekte gespeichert sind.
Ich benutze übrigens socket.io Version 1.3.5.
Wenn wir in das io-Objekt schauen, enthält es:
Hier sehen wir die Socketids "B5AC9w0sYmOGWe4fAAAA" usw. Also können wir tun,
Bei weiterer Betrachtung sehen wir wieder Segmente wie:
So können wir von hier aus einen Socket abrufen
Auch unter Motor haben wir,
So können wir auch schreiben,
Ich denke, wir können unser Ziel auf eine der drei oben genannten Arten erreichen:
quelle
Du kannst das
Auf dem Server.
Und für den Kunden ist es sehr einfach zu handhaben.
quelle
Stellen Sie ab Version 1.4.5 sicher, dass Sie in io.to () eine ordnungsgemäß vorangestellte socketId angeben. Ich habe die Socket-ID genommen, die der Client zum Debuggen angemeldet hat, und sie war ohne Präfix, sodass ich für immer gesucht habe, bis ich es herausgefunden habe! Möglicherweise müssen Sie dies folgendermaßen tun, wenn der ID, die Sie haben, kein Präfix vorangestellt ist:
quelle
io.sockets.sockets [socket.id] .emit (...) hat in Version 0.9 für mich funktioniert
quelle
Sie können auch Kundenreferenzen behalten. Aber das macht deine Erinnerung beschäftigt.
Erstellen Sie ein leeres Objekt und legen Sie Ihre Kunden darin fest.
Rufen Sie dann Ihren spezifischen Client anhand der ID des Objekts auf
quelle
Mit Socket.IO können Sie Ihre Sockets mit einem „Namespace“ versehen, was im Wesentlichen bedeutet, dass verschiedene Endpunkte oder Pfade zugewiesen werden.
Dies könnte helfen: http://socket.io/docs/rooms-and-namespaces/
quelle