So eine App in NodeJS ich schreibe, und meine Frage bitte Vorwort verstehen, wie mein Setup derzeit arbeitet:Socket.IO Emit aussendet an alle Clients
Ich habe Kunden, die über Socket.io Verbindung zu " Server X ", und dann verbindet sich mein" Server X "über Socket.io mit" Server Y "und sie senden alle Daten über Socket.io zurück.
Client-< ---> Server X < ---> Server Y
Clients beziehen sich auf Anwender und ihre Browser, und ich habe dann ein Knoten App sowohl läuft auf meinem Server x und y meinem Server.
Also in dem Code unten auf meinem Server X, wenn Sie Zeile 4 betrachten, funktioniert es genau so, wie es sollte. Sie sendet die Nachricht NUR an den Kunden, der sie angefordert hat.
io.on('connection', function(socket){
// This works just fine.
socket.emit('return_login', 'Test Message');
socket.on('login', function(data){
// This line correctly sends the data to Server Y
server_y.emit('login', data);
});
server_y.on('return_login', function(data){
// This emits to all connected clients???
socket.emit('return_login', data);
});
});
Nun mein Problem ist, wenn „Server Y“ return_login
auf Server x emittiert, was ich für Server x passieren soll, den Wert von Server y emittieren zu nehmen und es nur an den ursprünglichen Client zurückzuschicken, oder Webbrowser. Aus irgendeinem Grund wird diese Leitung jedoch an ALLE verbundenen Clients gesendet.
Ich habe einen Laptop, diesen Computer und mein Handy alle dies zu testen und jedes Mal, wenn es emittiert passiert es an JEDER sendet.
Wenn jemand mir bitte dabei helfen könnte, würde ich es sehr schätzen. Wenn ich mehr Code posten möchte, lass es mich wissen.
Du hast mein Problem gelöst, bin aber immer noch verwirrt. Warum löschen Sie die Socket-ID von diesem TempData-Objekt? Sie sagten im Kommentar make Datenkopie mit ID-Wert entfernt, so dass wir das nicht an den Client senden, aber möchten Sie nicht wissen, welche Socket-ID sie sind? Außerdem habe ich die Zeile 'server_y.removeListener ('return_login', fn);' entfernt, weil es so war, dass Sie nur eine Anmeldung versuchen konnten. – flakeyjake
@flakeyjake - Der Client muss die 'socket.id' der serverseitigen Verbindung nicht kennen, also dachte ich, ich würde sie entfernen, um die gleiche Datenstruktur beizubehalten, die Sie zuvor an den Client gesendet haben. Ich sehe hier keinen Grund, es an den Kunden senden zu wollen. Wenn Sie es nicht entfernen möchten, können Sie zulassen, dass es an den Client gesendet wird - kein Schaden. Ich wusste nicht, dass du dich mehr als einmal anmelden möchtest. Ja, um dies zu tun, würden Sie entweder einen neuen Listener einrichten, wenn Sie die Login-Nachricht senden oder nicht entfernen. – jfriend00
@flakeyjake - Da es so aussieht, als ob Sie hier neu sein könnten, wenn Ihre Antwort zu einer Lösung für Sie führt, können Sie dies der Community anzeigen, indem Sie auf das grüne Häkchen links neben der Antwort klicken. Dadurch erhalten Sie auch einige Reputationspunkte für das richtige Vorgehen. – jfriend00