io.emit vs socket.emit

Ik ben nieuw bij socket.io en ben iets tegengekomen dat nogal raar lijkt. Ik ken het verschil tussen socket.emiten io.emiteigenlijk niet, maar ik kan nergens een uitleg vinden.

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);

Dat zijn mijn serverdingen, maar als ik de ionaar socketverander, wordt dat bericht alleen weergegeven wanneer de gebruiker die verbinding maakt, verbinding maakt. io.emitstuurt het bericht naar alle gebruikers.

Misschien hoort het zo te zijn of is het gewoon een vreselijke hack? Laat het me weten als je de client-side HTML nodig hebt.


Antwoord 1, autoriteit 100%

Hier is een aanvullende documentatie ter referentie:

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.

Hopelijk helpt dit!.


Antwoord 2, autoriteit 23%

De variabele iovertegenwoordigt de groep sockets. De code die je hebt begint op regel één met een functie in de tweede parameter die je een socket-variabele geeft elke keer dat er een nieuwe verbinding wordt gemaakt. De variabele socketis alleen voor communicatie met elke individuele verbinding. Je ziet het misschien niet in de code, maar er zal één socket-variabele zijn voor elke tot stand gebrachte verbinding


Antwoord 3, autoriteit 6%

  • socket.emitstuurt alleen een bericht terug naar de afzender,
  • io.emitzal
    stuur een bericht naar alle klanten, inclusief de afzender
  • als je wilt verzenden
    bericht naar iedereen, maar niet terug naar de afzender en vervolgens socket.broadcast.emit

Antwoord 4

Dat is een goede vraag. Hier is een voorbeeldcode die uw vraag kan beantwoorden.

server.js-code:

// Luisteraar voor inkomende Socket-verbindingen

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.htmlsocket.emit('send', { "message": msg });verzendt/zendt deze coderegel feitelijk een bericht naar de server die wacht om te luisteren op socket.on('send', function(msg){deze regel code in server.js.

Nu io.sockets.emit('new', msg);stuurt deze regel van server.jsdat bericht naar al zijn sockets en wordt weergegeven aan gebruikers die zijn luisteraar in index.htmldat is socket.on('new', function (msg) {.

Simpel gezegd, elke socket verzendt zijn bericht naar een server (io is een instantie van server) en de server verzendt het op zijn beurt naar alle aangesloten sockets. Dat is hoe berichten die door een gebruiker zijn verzonden, aan alle gebruikers worden weergegeven. Ik hoop dat het helpt!

Other episodes