Подтвердить что ты не робот

Io.emit vs socket.emit

Я новичок в socket.io и перешел к чему-то, что кажется довольно странным. Я не знаю разницы между socket.emit и io.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);

Тем не менее, что мой сервер, когда я изменяю io на socket, это сообщение отображается только тогда, когда подключается подключаемый пользователь. io.emit отправляет сообщение всем пользователям.

Может быть, это должно быть так, или, может быть, это просто какой-то ужасный взлом? Дайте мне знать, если вам нужен HTML-код клиента.

4b9b3361

Ответ 1

Здесь приведена дополнительная документация для справки.

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.

Надеюсь, это поможет!.

Ответ 2

Переменная io представляет группу сокетов. Код, который у вас есть, начинается в первой строке с предоставлением функции во втором параметре, который дает вам переменную socket при каждом новом подключении. Переменная socket предназначена только для связи с каждым отдельным соединением. Вы можете не видеть его в коде, но будет одна переменная socket для каждого установленного соединения.

Ответ 3

Это хороший вопрос. Вот пример кода, который может ответить на ваш вопрос.

код server.js:

//Прослушиватель входящих соединений с сокетом

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>

В index.html socket.emit('send', { "message": msg }); эта строка кода фактически отправляет/отправляет сообщение на сервер, который ожидает прослушивания socket.on('send', function(msg){ этой строки кода в server.js.

Теперь io.sockets.emit('new', msg); эта строка из server.js отправляет это сообщение всем своим сокетам и отображается пользователям, использующим прослушиватель в index.html, который является socket.on('new', function (msg) {.

Проще говоря, каждый сокет отправляет свой msg серверу (например, это экземпляр сервера), а сервер, в свою очередь, передает его всем подключенным сокетам. Таким образом, сообщения, отправленные любым пользователем, отображаются для всех пользователей. Я надеюсь, что это помогает!