io.emit 与 socket.emit

Posted

技术标签:

【中文标题】io.emit 与 socket.emit【英文标题】:io.emit vs socket.emit 【发布时间】:2015-12-16 22:10:02 【问题描述】:

我是 socket.io 的新手,遇到了一些看起来很奇怪的事情。我实际上不知道socket.emitio.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,请告诉我。

【问题讨论】:

看起来当 io 连接到它时,它会为当前用户连接创建一个套接字。把它想象成一棵树,其中 io 位于顶部并分支成几个套接字。 【参考方案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.

希望这会有所帮助!

【讨论】:

在你告诉 socket.emit 的第一行意味着只发送到发送者-客户端,但在第 9 行你告诉 socket.emit(); //发送给所有连接的客户端!!!我不明白! 其实看需要。例如,在您的服务器上,您有这一行 -> socket.emit('message', 'initial message');。这会在脚本加载时触发。所以最初,所有监听“消息”的连接客户端都会显示“初始消息”行。 然而,当你的服务器上有这个 sn-p 时 -> socket.on('message-from-page1', function(message) socket.emit("message", "response for第 1 页"); );并说客户端发送一个 socket.emit('message-from-page1', 'hi from page 1');并且客户端也会监听“消息”,那么只有特定的客户端会收到“第 1 页的响应”行。 我为此创建了一个示例(虽然不知道如何在这里分享和模拟),请联系我,以便我可以快速演示它。我也很乐意分享代码。 谢谢,我现在明白你的意思了。但最好不要说socket.emit(); // send to all connected clients,因为您为"initial message" 提供的示例不是从运行的单一代码源启动的,例如,如果您发送socket.emit("initial message"+random),每个人都会收到不同的初始消息,但对于实际广播每个人应该得到相同的数字...【参考方案2】:

io 变量表示套接字组。您的代码从第一行开始,在第二个参数中提供一个函数,每次建立新连接时都会为您提供一个socket 变量。 socket 变量仅用于与每个单独的连接进行通信。您可能在代码中看不到它,但每个建立的连接都会有一个 socket 变量

【讨论】:

关于这个...问题的好答案:所以在我的 Node.js 服务器端代码中,当我有多个客户端通过 socket.io 连接时,需要将相同的数据 (JSON) 发送到所有客户端,如果我使用 io.emit 和 socket.emit,是不是更高效、更好的发射方式?【参考方案3】: socket.emit 只会将消息发回给发件人, io.emit会 向所有客户端发送消息,包括发送者 如果你想发送 向所有人发送消息但不返回给发件人然后socket.broadcast.emit

【讨论】:

【参考方案4】:

这是个好问题。这是一个示例代码,可能会回答您的问题。

server.js 代码:

// 传入 Socket 连接的监听器

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

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>

index.html socket.emit('send', "message": msg ); 这行代码实际上发送/发送消息到等待监听 socket.on('send', function(msg) 这行代码在 server.js时间>。

现在io.sockets.emit('new', msg); server.js 中的这一行将该消息发送到其所有套接字,并使用 index.html 中的侦听器显示给用户,即@987654326 @。

简单地说,每个套接字将其 msg 发送到服务器(io 是服务器的实例),然后服务器将其发送到所有连接的套接字。这就是任何用户发送的消息显示给所有用户的方式。希望对你有帮助!

【讨论】:

以上是关于io.emit 与 socket.emit的主要内容,如果未能解决你的问题,请参考以下文章

socket.io - socket.emit、socket.on、socket.send

socket.io emit callback调用探秘

Socket.io Emit 不起作用

socket.io emit返回相同的值

GoLang Socket.io Emit 没有被 React 接收

UnhandledPromiseRejectionWarning: TypeError: io.emit is not a function