【问题标题】:Trying to understand Socket.IO - socket and emit试图理解 Socket.IO - 套接字和发射
【发布时间】:2017-07-08 10:01:42
【问题描述】:

我正在尝试了解 Socket.IO,但我需要帮助。 我正在查看 Socket.IO 文档并找到了这段代码:

var io = require('socket.io')();
io.on('connection', function(socket){
  socket.emit('an event', { some: 'data' });
});

来源:http://socket.io/docs/server-api/#socket#emit(name:string[,-…]):socket

来自面向对象的编程背景,我知道第一行“导入”了 Socket.IO 库。此外,它“创建了一个 socket.io 的实例”,并将其保存为变量 io。

但是接下来的两行是做什么的呢?这个io.on是什么,'connection'是什么,参数socket的来源是什么,这是什么意思:一些:“数据”?

【问题讨论】:

    标签: node.js sockets socket.io


    【解决方案1】:

    但是接下来的两行是做什么的呢?这个io.on是什么,是什么 'connection',参数socket的来源是什么,什么 这是否意味着:一些:'数据'?

    让我们逐行浏览你的代码并解释一下:

    var io = require('socket.io')();
    io.on('connection', function(socket){
      socket.emit('an event', { some: 'data' });
    });
    

    第一行:

    var io = require('socket.io')();
    

    这条线做了三件事。首先,它使用require('socket.io') 加载模块。其次,它在返回的模块上调用构造函数,最后带有()。然后,它将构造函数的返回结果分配给变量io。根据 socket.io 文档,以这种方式调用构造函数会在默认端口 80 上启动一个 Web 服务器,该端口正在侦听传入的 socket.io 连接。构造函数的返回结果是socket.io服务器实例(在io变量中),可以用于未来的socket.io操作。

    然后,一行:

    io.on('connection', function(socket){
    

    socket.io 实例上的.on() 方法是注册事件处理程序的通用方法。一旦你更详细地了解了 node.js,你就会认出这是一个EventEmitter 接口,事实上,socket.io 实例是EventEmitter 的一个子类。因此,通过这个特定的.on() 方法调用,您正在为'connection' 事件注册一个事件处理程序。

    每当与您的 socket.io 服务器建立新的 socket.io 连接时,Socket.io 都会调用连接事件。这是您在新客户端连接时获得通知的方式。根据 socket.io 文档,您为该事件传递的回调将传递一个参数,即与新建立的连接关联的 socket 对象。此事件处理程序允许您在首次连接时立即查看每个新的 socket.io 连接。

    然后,一行:

    socket.emit('an event', { some: 'data' });
    

    这表示当建立新连接时,您希望立即向新的socket 发送一条消息。在 socket.io 中,消息由两部分组成 - 首先是消息名称,其次是一些可选的消息数据。在这种特殊情况下,消息名称是'an event'。消息名称必须是一个字符串,但是您可以将它们设置为几乎任何您想要的字符串名称(我认为可能有一些保留名称,例如 ping 和 pong,但除此之外,这完全取决于您来组成消息名称。为了接收您的服务器发送的消息,连接另一端的客户端只需要侦听您在此处发送的完全相同的消息名称。

    .emit() 的第二个参数是可选的,可以是您希望随消息一起发送的一些数据。这是一个更简单的例子来说明:

    socket.emit('setColor', 'blue');
    

    这会发送'setColor' 消息并与它一起发送数据"blue",以便接收客户端知道它应该设置为什么颜色。

    数据可以是任何可以用 JSON 正确表示的 Javascript 数据。因为您实际上无法通过网络发送实时 Javascript 对象或数组,所以这些对象被序列化为 JSON 格式,然后作为文本发送。接收客户端将反序列化它并将其转换回它应该是的任何数据类型。所以,在你的具体例子中,它是这样做的:

    socket.emit('an event', { some: 'data' });
    

    那是发送一个 Javascript 对象。 Javscript 中的{ some: 'data' } 语法是对象字面量的声明。在这种特殊情况下,这是一个 Javascript 对象,它有一个名为 some 的属性,并且该属性的值为 'data'。这显然只是出于示例目的,因为真实的应用程序可能会有更有意义的数据,例如:

    socket.emit('format', {fontSize: 16, color: 'blue', type: 'san serif'});
    

    然后,接收客户端将获得一个包含所有三个属性的 Javascript 对象 fontSizecolortype

    然后,一行:

    });
    

    这只是关闭了之前启动的io.on(... 行。

    【讨论】:

      【解决方案2】:

      io.on('connection'... 基本上告诉 Socket.io 监听这个事件。当socket.io建立连接时,我们执行回调:

       function (socket) { ... }
      

      下一行:

       socket.emit('an event', { some: 'data' });
      

      告诉 socket.io 通过管道发出或发送一个名为an event 的事件以及数据{ some: 'data' }。如果您了解事件在 jQuery 或常规的旧 js 中是如何工作的,那么这个流程就会很熟悉。这是jQuery中的一个示例

       // listening for the click event
       $('.foo').click(function (e, data) { // data is equal to foo
            alert('clicked');
            return false;
       }
      

      用于触发(发射)

       $('a').trigger('click', [ 'foo' ]);
      

      【讨论】:

      • 感谢您的回答。不幸的是,我不熟悉 jQuery。我仍然不明白这是什么意思:“一些:'数据'”。我不明白这种语法,以及到底发生了什么。
      • @qwerty - 听起来你需要备份和学习/学习一些 Javascript 基础知识。 {some: 'data'} 是一个 Javascript 对象字面量定义。 some 是属性名称。 'data' 表示一些有意义的数据(这只是演示中的一个占位符),即该属性的值。这个对象被序列化并发送到新的 socket.io 连接的另一端,客户端可以接收一个看起来像这个的对象
      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2021-04-20
      相关资源
      最近更新 更多