2015-09-20 4 views
19

Ich bin neu bei socket.io und bin in etwas hineingeraten, das ziemlich seltsam scheint. Ich weiß eigentlich nicht den Unterschied zwischen socket.emit und io.emit, aber ich kann nirgendwo eine Erklärung finden.io.emit vs socket.emit

io.on('connection', function(socket){ 
    io.emit('connected') // <<<<HERE>> socket.emit('connected'); 
    socket.on('disconnect', function(){ 
    io.emit('disconnect') 
    }); 
    socket.on('chat message', function(msg){ 
    io.emit('chat message', msg); 
    }); 
}); 

server.listen(3000); 

Das aber mein Server Zeug ist, wenn ich die io-socket diese Nachricht ändern wird nur angezeigt, wenn der Benutzer, der eine Verbindung herstellt verbindet. io.emit sendet die Nachricht an alle Benutzer.

Vielleicht sollte es so sein oder vielleicht ist es nur ein schrecklicher Hack? Lassen Sie mich wissen, wenn Sie das clientseitige HTML benötigen.

+0

Die Antwort finden Sie hier: http://stackoverflow.com/questions/10058226/send-response-to-all-clients-except-sender-socket-io Sorry wegen der Betrogenen. – Manu

+0

Es sieht so aus, als wenn der io mit ihm verbunden ist, erstellt einen Socket nur für die aktuelle Benutzerverbindung. Stellen Sie es als einen Baum dar, wo io oben ist und in mehrere Sockel verzweigt. – kezi

Antwort

23

Die io Variable repräsentiert die Gruppe von Sockeln. Der Code, den Sie haben, beginnt in Zeile eins mit der Bereitstellung einer Funktion im zweiten Parameter, die Ihnen bei jeder neuen Verbindung eine Variable socket gibt. Die Variable socket dient nur zur Kommunikation mit jeder einzelnen Verbindung. Sie können es nicht im Code sehen, aber es wird eine socket Variable für jede hergestellte Verbindung geben

+0

große Antwort auf diese ... Frage: so in meinem Node.js serverseitigen Code, wenn ich mehrere Clients über socket.io verbunden habe, und die gleichen Daten (JSON) an alle Clients senden, wenn ich io tun .emit vs socket.emit, ist es effizienter und besser Weg zu emittieren? – tamak

33

Hier ist eine ergänzende Dokumentation als Referenz.

socket.emit('message', "this is a test"); //sending to sender-client only 
socket.broadcast.emit('message', "this is a test"); //sending to all clients except sender 
socket.broadcast.to('game').emit('message', 'nice game'); //sending to all clients in 'game' room(channel) except sender 
socket.to('game').emit('message', 'enjoy the game'); //sending to sender client, only if they are in 'game' room(channel) 
socket.broadcast.to(socketid).emit('message', 'for your eyes only'); //sending to individual socketid 
io.emit('message', "this is a test"); //sending to all clients, include sender 
io.in('game').emit('message', 'cool game'); //sending to all clients in 'game' room(channel), include sender 
io.of('myNamespace').emit('message', 'gg'); //sending to all clients in namespace 'myNamespace', include sender 
socket.emit(); //send to all connected clients 
socket.broadcast.emit(); //send to all connected clients except the one that sent the message 
socket.on(); //event listener, can be called on client to execute on server 
io.sockets.socket(); //for emiting to specific clients 
io.sockets.emit(); //send to all connected clients (same as socket.emit) 
io.sockets.on() ; //initial connection from a client. 

Hoffe das hilft !.

+1

in der ersten Zeile, die Sie socket.emit gesagt haben, bedeutet, nur an den Sender-Client zu senden, aber in der 9. Zeile haben Sie socket.emit(); // an alle angeschlossenen Clients senden !!! Ich verstehe nicht! – Unicornist

+0

Eigentlich hängt es von der Notwendigkeit ab. Zum Beispiel, auf Ihrem Server haben Sie diese Zeile -> socket.emit ('Nachricht', 'Anfangsnachricht') ;.Dies wird beim Laden des Skripts ausgelöst. Zu Beginn zeigen alle verbundenen Clients, die "Nachricht" hören, die Zeile "Anfangsnachricht" an. –

+0

Wenn Sie jedoch dieses Snippet auf Ihrem Server haben -> socket.on ('message-from-page1', Funktion (Nachricht) {socket.emit ("Nachricht", "Antwort für Seite 1");}); und sagen, ein Client sendet eine socket.emit ('message-from-page1', 'hi von page 1'); und der Client hört auch auf "Nachricht", dann erhält nur dieser bestimmte Client die Zeile "Antwort für Seite 1". –

0

Das ist eine gute Frage. Hier ist ein Beispielcode, der Ihre Frage beantworten könnte.

server.js Code:

// Listener für eingehende Socketverbindungen

io.on('connection', function(socket){ 
    socket.on('send', function(msg){ 
    console.log('message received/sending: ' + msg); 
    io.sockets.emit('new', msg); 
    }); 
}); 

index.html Code

<body> 
    <ul id="messages"></ul> 
    <form action=""> 
     <input id="m" autocomplete="off" /> 
     <button type="submit">Send</button> 
    </form> 
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script> 
    <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> 
    <script> 
     var socket = io(); 
     function send(msg) { 
      console.log("emitting: " + msg); 
      socket.emit('send', { "message": msg }); 
     } 

     socket.on('new', function (msg) { 
      console.log("msg " + msg.message); 
      $('#messages').append($('<li>').text(msg.message)); 
     }); 

     $(function() { 
      $('form').submit(function (e) { 
       e.preventDefault(); 
       send($('#m').val()); 
       $('#m').val(''); 
       return false; 
      }); 
     }); 
    </script> 
</body> 

In index.html „socket.emit ('Senden' , {"Nachricht": Nachricht}); " diese Codezeile sendet/sendet tatsächlich eine Nachricht an den Server, der darauf wartet, auf "socket.on ('send', function (msg) {" diese Codezeile in server.js zu hören. Jetzt "io.sockets.emit (' new ', msg); "Diese Zeile von server.js gibt diese Nachricht an alle ihre Sockets aus und wird den Benutzern mit ihrem Listener in index.html angezeigt, das heißt" socket.on (' new ', function (msg) {".

Einfach gesagt Jeder Socket sendet seine Nachricht an den Server (io ist Instanz des Servers) und der Server wiederum sendet es an alle angeschlossenen Sockets.Das ist wie MSG von jedem Benutzer an alle Benutzer angezeigt wird.Ich hoffe, es hilft!

Verwandte Themen