node.js基于socket.io快速实现一个实时通讯应用(3)

必须包括Sec-WebSocket-Accept头域,其值是将请求包“Sec-WebSocket-Key”的值,与”258EAFA5-E914-47DA-95CA-C5AB0DC85B11″这个字符串进行拼接,然后对拼接后的字符串进行sha-1运算,再进行base64编码,就是“Sec-WebSocket-Accept”的值;

应答包中冒号后面有一个空格;

最后需要两个空行作为应答包结束。

请求数据

EIO: 3 transport: websocket sid: 8Uehk2UumXoHVJRzAAAA

EIO:3 表示使用的是engine.io协议版本3

transport 表示传输采用的类型

sid: session id (String)

Frames

WebSocket协议使用帧(Frame)收发数据,在控制台->Frames中可以查看发送的帧数据。

其中帧数据前的数字代表什么意思呢?

这是 Engine.io协议,其中的数字是数据包编码:

<Packet type id> [<data>]

0 open——在打开新传输时从服务器发送(重新检查)

1 close——请求关闭此传输,但不关闭连接本身。

2 ping——由客户端发送。服务器应该用包含相同数据的乓包应答

客户端发送:2probe探测帧

3 pong——由服务器发送以响应ping数据包。

服务器发送:3probe,响应客户端

4 message——实际消息,客户端和服务器应该使用数据调用它们的回调。

5 upgrade——在engine.io切换传输之前,它测试,如果服务器和客户端可以通过这个传输进行通信。如果此测试成功,客户端发送升级数据包,请求服务器刷新其在旧传输上的缓存并切换到新传输。

6 noop——noop数据包。主要用于在接收到传入WebSocket连接时强制轮询周期。

实例

node.js基于socket.io快速实现一个实时通讯应用

node.js基于socket.io快速实现一个实时通讯应用

以上的截图是上述例子中数据传输的实例,分析一下大概过程就是:

connect握手成功

客户端会发送2 probe探测帧

服务端发送响应帧3probe

客户端会发送内容为5的Upgrade帧

服务端回应内容为6的noop帧

探测帧检查通过后,客户端停止轮询请求,将传输通道转到websocket连接,转到websocket后,接下来就开始定期(默认是25秒)的 ping/pong

客户端、服务端收发数据,4表示的是engine.io的message消息,后面跟随收发的消息内容

为了知道Client和Server链接是否正常,项目中使用的ClientSocket和ServerSocket都有一个心跳的线程,这个线程主要是为了检测Client和Server是否正常链接,Client和Server是否正常链接主要是用ping pong流程来保证的。

该心跳定期发送的间隔是socket.io默认设定的25m,在上图中也可观察发现。该间隔可通过修改。

node.js基于socket.io快速实现一个实时通讯应用

参考engine.io-protocol

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/7f4a754eb36df15e8155d33bc4034f3d.html