Node.js 试图理解Socket.IO-Socket和emit

Node.js 试图理解Socket.IO-Socket和emit,node.js,sockets,socket.io,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' }); }); 资料来源: 来自面向对象编程背景,我知道第一行“导入”Socket.IO库。此外,它还“创建一个socket.io实例”,该实例保存为变量io 但是接下来的两行做

我试图理解Socket.IO,但我需要帮助。 我正在查看Socket.IO文档,发现以下代码:

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

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

但是接下来的两行做什么呢?这个io.on是什么,什么是“连接”,参数套接字的来源是什么,这意味着什么:一些“数据”

io.on('connection')…
基本上告诉Socket.io侦听此事件。当Socket.io建立连接时,我们执行回调:

 function (socket) { ... }
下一行:

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

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

但是接下来的两行是做什么的呢?这个io是什么 “连接”,参数套接字的来源是什么,以及 这是否意味着:一些“数据”

让我们逐行检查您的代码并解释:

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

var io = require('socket.io')();
io.on('connection', function(socket){
socket.emit('an event', { some: 'data' });
});
此行有三件事。首先,它用
require('socket.io')
加载模块。其次,它用
()调用返回模块上的构造函数
。然后,它将构造函数的返回结果分配给变量
io
。根据socket.io文档,以这种方式调用构造函数将在默认端口80上启动一个web服务器,该端口正在侦听传入的socket.io连接。构造函数的返回结果是socket.io服务器实例(在
io
变量中),可用于将来的socket.io操作

然后,行:

var io = require('socket.io')();
io.on('connection', function(socket){
socket.emit('an event', { some: 'data' });
});
socket.io实例上的
.on()
方法是注册事件处理程序的一种通用方法。一旦您对node.js有了更详细的了解,您就会认识到这是一个
EventEmitter
接口,事实上,socket.io实例是
EventEmitter
的子类。因此,对于这个特殊的
.on()
method调用,您正在为
'connection'
事件注册事件处理程序

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

然后,行:

var io = require('socket.io')();
io.on('connection', function(socket){
socket.emit('an event', { some: 'data' });
});
这表示当建立新连接时,您希望立即向新的
套接字发送消息。在socket.io中,消息由两部分组成,第一部分是消息名,第二部分是一些可选的消息数据。在这种特殊情况下,消息名为
'an event'
。消息名必须是字符串,但您可以一个可以让他们几乎任何你想要的字符串名(我认为可能会有一些保留名称,例如ping和pong,但除此之外,这完全取决于您来创建消息名称。为了接收服务器发送的消息,连接另一端的客户端只需要侦听您在此处发送的完全相同的消息名称

.emit()
的第二个参数是可选的,可以是希望随消息一起发送的一些数据。下面是一个简单的示例:

socket.emit('setColor', 'blue');
这将发送
'setColor'
消息,并发送数据
“blue”
,以便接收客户端知道应将其设置为什么颜色

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

socket.emit('an event', { some: 'data' });
这是在发送一个Javascript对象。
{some:'data'}
Javscript中的语法是对象文字的声明。在这种特殊情况下,这是一个Javascript对象,它有一个名为
some
的属性,该属性的值是
'data'
。这显然只是出于示例目的,因为实际应用程序可能会有更多有意义的数据,例如:

socket.emit('format', {fontSize: 16, color: 'blue', type: 'san serif'});
然后,接收客户端将获得一个Javascript对象,其中包含
fontSize
color
type

然后,行:

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

这只是关闭了(…
行上以前启动的
io.。

感谢您的回答。不幸的是,我不熟悉jQuery。我仍然不理解这意味着什么:“一些:'数据'”。我不明白这个语法,也不明白到底发生了什么。@qwerty-听起来你需要备份和学习一些Javascript基础知识。
{some:'data'}
是一个Javascript对象文字定义。
some
是一个属性名。
'data'
代表一些有意义的数据(这只是演示中的一个占位符)该属性的值。此对象被序列化并发送到新socket.io连接的另一端,客户端可以在该连接处接收与此类似的对象