当前位置 : 主页 > 网页制作 > Nodejs >

node.js – socket.io的工作原理

来源:互联网 收集:自由互联 发布时间:2021-06-16
我想知道socket.io方法如何用于发出某个事件,我已经读过它不像长轮询方法,而是一个可以在所有不同浏览器上工作的不同方法…客户端如何保持 – 没有长轮询请求与服务器联系? 我是
我想知道socket.io方法如何用于发出某个事件,我已经读过它不像长轮询方法,而是一个可以在所有不同浏览器上工作的不同方法…客户端如何保持 – 没有长轮询请求与服务器联系?

我是node.js的新手,我想为eventdriven服务器实现我自己的系统(是的……重新发明轮子!)因为我想用手触摸这个如此简单的“socket.io – emit ()“ 方法.

谢谢你的帮助!

以下是socket.io的工作原理:

首先,socket.io是一个位于webSocket之上的瘦协议层,所以我们真的要讨论webSocket的工作原理.

> webSocket连接以普通HTTP请求开始,该请求具有一个特殊标头集,即升级标头,它请求从HTTP协议升级到webSocket协议.
>当服务器收到请求并看到升级标头时,如果它支持该协议,则它会响应101响应(切换协议)和其他一些标头.当客户端收到此响应(以及其他一些与安全性相关的标头)时,两端都会将该套接字上的协议切换到webSocket协议.
>因为webSocket协议被设计为持续连接,所以客户端和服务器保持原始套接字打开以供将来通信,事实上,它保持开放,直到任何一方决定它们最终完成webSocket通信通道然后关闭套接字.
>因此,插座保持打开状态很长时间.这使得任何一方都可以随时向另一方发送消息.这就是它避免轮询的方式.而不是来自客户端的时间HTTP请求,询问服务器:“你有m的任何新数据吗?”,客户端可以坐在那里听取传入的消息.当服务器有新的东西发送客户端时,它已经有了这个打开的webSocket连接,它可以随时向客户端发送消息.
> Socket.io在webSocket上添加了一些功能.它添加的主要内容是:1)如果套接字连接因任何原因丢失,则自动重新连接; 2)从一端定期ping到另一端以检测何时连接丢失; 3)消息传递层使其变得微不足道将命名消息从一端发送到另一端.

I would like to know how socket.io methods work for emitting a certain
event, I’ve read that it is not like long-polling method but a
different one that can work on all of different browsers

这不是长轮询,因为它在客户端持续时间内保持套接字连接打开.这种长期,开放的连接可用于从客户端到服务器或从服务器到客户端发送消息,而无需在每次要发送时创建新连接.这适用于任何支持webSocket协议的浏览器.

How could a client keep-in-contact with the server without a long
polling request?

webSocket连接被设计为长期连接而不是典型的时间HTTP连接.

如果您想了解有关webSocket协议本身的更多信息,可以在此MDN文章中看到相当不错的描述:Writing webSocket Servers.

以下是打开webSocket的初始客户端请求的示例:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

并且,这是一个典型的服务器响应,它确认切换到webSocket协议:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

然后,一旦协议被更改,这里的webSocket数据框如下所示:

0               1               2               3              
 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 4               5               6               7              
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
 8               9               10              11             
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
 12              13              14              15
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+

Socket.io使用webSocket数据帧,但在该帧的有效负载内插入自己的消息格式,允许它发送命名消息.

网友评论