试图了解Socket.IO - socket和emit

时间:2017-02-19 00:33:05

标签: node.js sockets socket.io

我试图了解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 ,什么是'连接' 参数套接字的来源是什么,以及什么这是否意味着:一些:'数据'

2 个答案:

答案 0 :(得分:3)

  

但接下来的两行是做什么的?这是什么,是什么   'connection',参数套接字的来源是什么,以及什么   这是否意味着:某些:'数据'?

让我们逐行完成您的代码并解释:

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(...行。

答案 1 :(得分:0)

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