Search…
⌃K
Links

2.7.1 内部概述引擎底层依赖关系图

Connection连接

const client =io('https://myhost.com')
执行以下步骤:
  • 在客户端,创建一个engine.io-client实例
  • engine.io-client实例尝试建立轮询传输
GET https://myhost.com/socket.io/?EIO=3&transport=polling&t=ML4jUwU&b64=1
如下:
"EIO=3" # Engine.io协议的当前版本
"transport=polling" # 正在建立的传输
"t=ML4jUwU&b64=1" # 用于缓存总线的哈希时间戳
  • engine.io服务器响应为:
{
"type": "open",
"data": {
"sid": "36Yib8-rSutGQYLfAAAD", // 唯一会话ID
"upgrades": ["websocket"], // 可能的运输升级列表
"pingInterval": 25000, // 心跳机制的第一个参数
"pingTimeout": 5000 // 心跳机制的第二个参数
}
}
  • 内容由engine.io-parser编码为:
'96:0{"sid":"hLOEJXN07AE0GQCNAAAB","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}2:40'
详细:
"96" # 第一条消息的长度
":" # 长度和内容之间的分隔符
"0" # "打开的"消息类型
'{"sid":"hLOEJXN07AE0GQCNAAAB","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}' # JSON编码的握手数据
"2" # 第二条消息的长度
":" # 长度和内容之间的分隔符
"4" # 消息类型
"0" # socket.io协议中的"打开的"消息类型
  • 然后由客户端的engine.io-parser对内容进行解码。
  • engine.io-client级别发出open事件
  • socket.io-client级别发出connect事件

升级

一旦刷新了现有传输(XHR轮询)的所有缓冲区,就可以通过发送探测来测试升级。
GET wss://myhost.com/socket.io/?EIO=3&transport=websocket&sid=36Yib8-rSutGQYLfAAAD
具体:
"EIO=3" # 同样,当前版本的engine.io协议
"transport=websocket" # 正在调查的新传输
"sid=36Yib8-rSutGQYLfAAAD" # 唯一的会话id
  • 客户端在websocket帧中发送“ping”包,由engine.io-parser编码为2probe,其中2是“ping”消息类型。
  • 服务器响应一个“pong”包,编码为3probe,其中3是“pong”消息类型。
  • 在接收到“pong”包时,升级被认为是完成的,并且所有以下消息都通过新的传输。