2015-09-20 9 views
19

Jestem nowy w serwisie socket.io i uruchomiłem coś, co wydaje się dość dziwne. Tak naprawdę nie znam różnicy między socket.emit i io.emit, ale nie mogę znaleźć nigdzie wyjaśnienia.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); 

To mój serwer rzeczy jednak przy zmianie io do socket że wiadomość zostanie wyświetlona tylko wtedy, gdy użytkownik, który łączy Łączy. io.emit wysyła wiadomość do wszystkich użytkowników.

Może to powinno tak być, a może to tylko jakiś straszny hack? Daj mi znać, jeśli potrzebujesz kodu HTML po stronie klienta.

+0

odpowiedź można znaleźć tutaj: http://stackoverflow.com/questions/10058226/send-response-to-all-clients-except-sender-socket-io Przepraszam za dupek. – Manu

+0

Wygląda na to, że po podłączeniu urządzenia ioi tworzy gniazdo tylko dla bieżącego połączenia użytkowników. Wyobraź sobie, że to drzewo, w którym znajduje się u góry i rozgałęzia się na kilka gniazd. – kezi

Odpowiedz

23

Zmienna io reprezentuje grupę gniazd. Kod, który masz uruchomiony, zaczyna się od pierwszej, zapewniając funkcję w drugim parametrze, która daje zmienną socket za każdym razem, gdy tworzone jest nowe połączenie. Zmienna socket służy tylko do komunikacji z każdym pojedynczym połączeniem. Możesz nie zobaczyć go w kodzie, ale będzie jedna zmienna socket dla każdego połączenia ustanowionego

+0

wspaniała odpowiedź na to pytanie: więc w moim kodzie strony serwera Node.js, gdy mam wielu klientów podłączonych przez socket.io, i muszę wysłać te same dane (JSON) do wszystkich klientów, jeśli zrobię .emit vs socket.emit, czy jest wydajniejszy i lepszy sposób na emisję? – tamak

33

Oto dodatkowa dokumentacja dla odniesienia.

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. 

Mam nadzieję, że to pomoże !.

+1

w pierwszym wierszu powiedziałeś socket.emit oznacza wysyłanie tylko do nadawcy-klienta, ale w dziewiątej linii powiedziałeś socket.emit(); // wyślij do wszystkich podłączonych klientów !!! Nie rozumiem! – Unicornist

+0

Właściwie to zależy od potrzeb. Na przykład na twoim serwerze masz tę linię -> socket.emit ("wiadomość", "wiadomość początkowa");To uruchamia się po załadowaniu skryptu. Tak więc początkowo wszyscy podłączeni klienci, którzy nasłuchują "wiadomości", będą wyświetlać linię "wiadomość początkowa". –

+0

Jednakże, jeśli masz ten fragment na swoim serwerze -> socket.on ("message-from-page1", function (message) {socket.emit ("message", "response for page 1");}); i powiedz, że klient wysyła socket.emit ("message-from-page1", "hi from page 1"); a klient również słucha "wiadomości", wtedy tylko ten konkretny klient otrzyma linię "Odpowiedź na stronę 1". –

0

To dobre pytanie. Oto przykładowy kod, który może odpowiedzieć na twoje pytanie.

kod server.js:

// Listener dla połączeń przychodzących nasadowe

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

kod 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> 

W index.html „socket.emit ('wyślij' , {"message": msg}); " ta linia kodu faktycznie wysyła/wysyła wiadomość do serwera, który czeka na nasłuch na "socket.on ('send', function (msg) {" ta linia kodu w server.js. Teraz "io.sockets.emit (' new ', msg); "ta linia z serwera server.js emituje tę wiadomość do wszystkich gniazd i jest wyświetlana użytkownikom używającym jej detektora w index.html, który jest" socket.on ("new", function (msg) {".

Po prostu powiedziane Każde gniazdo emituje swoje msg na serwer (io jest instancją serwera), a serwer z kolei wysyła je do wszystkich podłączonych gniazd.W ten sposób msg wysłany przez dowolnego użytkownika jest wyświetlany wszystkim użytkownikom. Mam nadzieję, że to pomoże!