2015-09-20 2 views
19

Sono nuovo di zio.io e mi sono imbattuto in qualcosa che sembra piuttosto strano. In realtà non conosco la differenza tra socket.emit e io.emit ma non riesco a trovare una spiegazione da nessuna parte.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); 

Questa è la mia roba assistente tuttavia quando cambio la io-socket quel messaggio ottiene visualizzato solo quando l'utente che si collega collega. io.emit invia il messaggio a tutti gli utenti.

Forse dovrebbe essere così o forse è solo un orribile hack? Fammi sapere se hai bisogno dell'HTML lato client.

+0

La risposta può essere trovata qui: http://stackoverflow.com/questions/10058226/send-response-to-all-clients-except-sender-socket-io Scusate per il dupe. – Manu

+0

Sembra che quando io sia collegato ad esso crei un socket solo per la connessione corrente degli utenti. Immaginalo come un albero dove io è in cima e si dirama in diverse prese. – kezi

risposta

23

La variabile io rappresenta il gruppo di socket. Il codice che si inizia sulla prima riga fornisce una funzione nel secondo parametro che fornisce una variabile socket ogni volta che viene effettuata una nuova connessione. La variabile socket è solo per la comunicazione con ogni singola connessione. Potresti non vederlo nel codice ma ci sarà una variabile socket per ogni connessione stabilita

+0

ottima risposta a questa ... domanda: quindi nel mio codice lato server Node.js, quando ho più client connessi tramite socket.io, e devo inviare gli stessi dati (JSON) a tutti i client, se lo faccio io .emit vs socket.emit, è il modo più efficiente e migliore di emettere? – tamak

33

Ecco una documentazione supplementare di riferimento.

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. 

Spero che questo aiuti !.

+1

alla prima riga che hai detto socket.emit significa inviare solo al client-mittente ma nella 9a riga hai detto socket.emit(); // invia a tutti i client collegati !!! Non capisco! – Unicornist

+0

In realtà dipende dalla necessità. Ad esempio, sul tuo server hai questa linea -> socket.emit ('message', 'initial message') ;.Questo si accende sul caricamento di script. Quindi, inizialmente, tutti i client connessi che ascoltano "messaggio" visualizzeranno la riga "messaggio iniziale". –

+0

Tuttavia, quando si ha questo snippet sul proprio server -> socket.on ('message-from-page1', function (message) {socket.emit ("message", "response for page 1");}); e dire che un client invia un socket.emit ('message-from-page1', 'hi dalla pagina 1'); e il client ascolta anche "messaggio", quindi solo quel particolare client riceverà la riga "risposta per pagina 1". –

0

Questa è una buona domanda. Ecco un codice di esempio che potrebbe rispondere alla tua domanda.

codice server.js:

// Listener per le connessioni socket in arrivo

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

codice index.html

<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 ('inviare' , {"message": msg}); " questa riga di codice invia/emette effettivamente un messaggio al server che è in attesa di ascoltare "socket.on ('send', function (msg) {" questa riga di codice in server.js. Ora "io.sockets.emit (' nuovo ', msg); "questa riga da server.js emette quel messaggio a tutti i suoi socket e viene visualizzata agli utenti che usano il suo listener in index.html cioè" socket.on (' new ', function (msg) {".

semplicemente detto ogni presa emette la sua msg al server (io è un'istanza del server) e il server a sua volta emette a tutte le prese collegate. Questo è il modo msg inviati da qualsiasi utente viene visualizzato a tutti gli utenti. spero che aiuta!