web-dev-qa-db-fra.com

io.emit vs socket.emit

Je suis nouveau sur socket.io et je suis tombé sur quelque chose qui semble assez étrange. Je ne connais pas vraiment la différence entre socket.emit et io.emit mais je ne trouve aucune explication.

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

C’est le cas pour mon serveur. Cependant, lorsque je change de io en socket, ce message ne s’affiche que lorsque l’utilisateur qui se connecte se connecte. io.emit envoie le message à tous les utilisateurs.

Peut-être que c'est supposé être comme ça ou peut-être que c'est juste un horrible bidouillage? Faites-moi savoir si vous avez besoin du code HTML côté client.

31
Manu

Voici une documentation supplémentaire pour référence.

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.

J'espère que cela t'aides!.

53
Kent Aguilar

La variable io représente le groupe de sockets. Le code que vous avez commence à la première ligne en fournissant une fonction dans le deuxième paramètre qui vous donne une variable socket chaque fois qu'une nouvelle connexion est établie. La variable socket sert uniquement à communiquer avec chaque connexion. Vous ne le verrez peut-être pas dans le code, mais il y aura une variable socket pour chaque connexion établie

28
kezi

C'est une bonne question. Voici un exemple de code qui pourrait répondre à votre question.

code server.js:

// Listener pour les connexions entrantes Socket 

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

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

Dans index.html "socket.emit ('send', {" message ": msg});" cette ligne de code envoie ou émet un message au serveur qui attend d'écouter sur "socket.on ('send', function (msg) {" cette ligne de code dans server.js. Maintenant, "io.sockets.emit (' new ', msg); "cette ligne de server.js émet ce message à tous ses sockets et est affichée aux utilisateurs utilisant son écouteur dans index.html qui est" socket.on (' new ', function (msg) {".

Simplement dit Chaque socket envoie son message au serveur (io est une instance de serveur) et le serveur l’émet à son tour à tous les sockets connectés. C'est ainsi que les messages envoyés par n'importe quel utilisateur sont affichés à tous les utilisateurs. J'espère que ça aide!

0
Shama