【问题标题】:socket.emit() vs. socket.send()socket.emit() 与 socket.send()
【发布时间】:2012-07-14 22:59:59
【问题描述】:

这两者有什么区别?

我注意到如果我在工作程序中从socket.emit 更改为socket.send,服务器无法接收到消息,虽然我不明白为什么。

我还注意到,在我的程序中,如果我从socket.emit 更改为socket.send,服务器会收到一条消息,但它似乎收到了多次。当我使用console.log() 查看服务器收到的内容时,它显示的内容与我使用socket.emit 时不同。

为什么会有这种行为?你怎么知道何时使用socket.emitsocket.send

【问题讨论】:

    标签: sockets node.js socket.io


    【解决方案1】:

    使用 socket.emit 你可以像这样注册自定义事件:

    服务器:

    var io = require('socket.io').listen(80);
    
    io.sockets.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    

    客户:

    var socket = io.connect('http://localhost');
    socket.on('news', function (data) {
      console.log(data);
      socket.emit('my other event', { my: 'data' });
    });
    

    Socket.send 做同样的事情,但你没有注册到“新闻”,而是注册到消息:

    服务器:

    var io = require('socket.io').listen(80);
    
    io.sockets.on('connection', function (socket) {
      socket.send('hi');
    });
    

    客户:

    var socket = io.connect('http://localhost');
    socket.on('message', function (message) {
      console.log(message);
    });
    

    【讨论】:

    • 看起来差别不是很大。它看起来像 socket.emit() 可以做所有 socket.on() 可以做的事情。他们为什么要实现这个功能?
    • 我不知道,我检查了源代码,它们几乎相同(github.com/LearnBoost/socket.io/blob/master/lib/socket.js#L318)。也许它是历史性的,只是为了向后兼容。
    • 另外请注意,这篇文章的未来读者,这是关于 socket.io,而不是 node.js TCP、UDP 或 Unix 套接字。
    • 是否可以使用 vanilla javascript Websockets 进行发射?
    • 看起来socket.send 只是socket.emit('message', message); 的别名
    【解决方案2】:

    简单而精确(来源:Socket.IO google group):

    socket.emit 允许您在服务器和客户端上发出自定义事件

    socket.send 发送通过'message' 事件接收的消息

    【讨论】:

      【解决方案3】:

      TL;DR:

      socket.send(data, callback)本质上等同于调用socket.emit('message', JSON.stringify(data), callback)

      如果不查看源代码,我会假设 send 函数更有效编辑:至少对于发送字符串消息

      所以是的,基本上,emit 允许您发送对象,这非常方便。

      socket.emit为例:

      sendMessage: function(type, message) {
          socket.emit('message', {
              type: type,
              message: message
          });
      }
      

      对于那些在家记分的人来说,这是使用socket.send 的样子:

      sendMessage: function(type, message) {
          socket.send(JSON.stringify({
              type: type,
              message: message
          }));
      }
      

      【讨论】:

        【解决方案4】:

        socket.send 是为了与 vanilla WebSocket 接口兼容而实现的。 socket.emit 仅是 Socket.IO 的功能。它们都做同样的事情,但socket.emit 在处理消息时更方便一些。

        【讨论】:

        • socket.emit 不仅限于 Socket.IO,也适用于网络。
        【解决方案5】:

        在基本的双向通信系统中,socket.emit 已被证明更令人信服且易于使用(个人经验),并且是主要为此目的而构建的 Socket.IO 的一部分

        【讨论】:

          【解决方案6】:

          https://socket.io/docs/client-api/#socket-send-args-ack

          socket.send // 发送消息事件

          socket.emit(eventName[, ...args][, ack]) // 可以自定义事件名

          【讨论】:

            猜你喜欢
            • 2013-05-12
            • 2015-12-16
            • 2013-10-12
            • 1970-01-01
            • 1970-01-01
            • 2012-01-07
            • 1970-01-01
            • 2012-09-24
            相关资源
            最近更新 更多