第三版的Engine.io 協議git
來看一下 Engine.io 會話github
1 建立一個會話鏈接到Engine.io使用 URL
web
2 當鏈接 open 的時候,server會響應一下JSON-encoded 握手數據:json
。 sid 會話ID(string)服務器
。 upgrades 會話升級得字符串(Array of String)websocket
。 pingTimeout Server配置的ping超時時間
session
3 客戶端發送ping 服務器端要發送pong 響應框架
4 客戶端和服務器端能夠隨意交換消息包。socket
5 Polling transports 能夠發送一個「close」 關閉socket。由於他老是「opening」 and 「closing」oop
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