第三版的Engine.io 协议
来看一下 Engine.io 会话
1 创建一个会话连接到Engine.io使用 URL
2 当连接 open 的时候,server会响应一下JSON-encoded 握手数据:
。 sid 会话ID(string)
。 upgrades 会话升级得字符串(Array of String)
。 pingTimeout Server配置的ping超时时间
3 客户端发送ping 服务器端要发送pong 响应
4 客户端和服务器端可以随意交换消息包。
5 Polling transports 可以发送一个“close” 关闭socket。因为他总是“opening” and “closing”
URLs
一个 Engine.io url的组成:
/engine.io/[?]
1 engine.io pathName的更改取决于使用者使用的 更高级别的框架。
2 还有四个保留的query string :
。 transport 连接协议的名称
。 j 如果transport 是 polling , JSONP响应是必须的, j 必须设置为JSONP的响应索引。
。 sid 如果客户端提供了session Id, 那么query string上就必须有
。 b64 如果不支持xhr2, b64=1 就表示server端的binary data 发送的是base64 编码的数据。
Encoding
编码的包里面包含两部分
packet
payload
Packet
这是一个UTF-8编码的string or binary data。
Stirng <packet type id>[<data>] example 2probe
binary data: 当我们发送二进制数据的时候 type id 要是第一个字节, 剩下是实际的内容 4|0|1|2|3|4|5
packet type id:
0 open 向服务端发送一个创建新的传输连接
1 close 关闭当前的传输协议, 但并不关闭当前的socket 连接
2 ping 发送ping 包 example 2probe
3 pong 发送pong 包 example 3probe
4 message 表示发送的是消息
example server 发送 4HelloWorld
client 接收消息并回调 socket.on(‘message‘, function(data) {console.log(data)})
5 upgrade
在服务器和客户端切换传输协议之前, 根据upgrade 发送的协议测试,如果成功就切换新传输协议
6 noop
主要使用在轮询升级到websocket时
example
1 client 创建新的连接和传输协议
2 client send 2probe
3 server send 3probe
4 client send 5
5 server 清理和关闭旧的传输协议,并切换到新的传输协议
Payload
由一组一组的<length1>:<packet1>这样的包组成, 不支持xhr2.
Transport
支持的传输协议
websocket
flashsocket
polling
jsonp
xhr
https://github.com/socketio/engine.io-protocol