Switch branches/tags
Nothing to show
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
README
client.html
jquery.min.js
websocket.js
websocket_http_server.go
websocket_server.go

README

{websocket协议阅读要点记录}

1.客户端必须掩码(mask)它发送到服务器的所有帧(更多详细信息请参见 5.3 节)。
2.当收到一个没有掩码的帧时,服务器必须关闭连接。在这种情况下,服务器可能发送一个定义在 7.4.1 节的状态码 1002(协议错误)的 Close 帧。
3.服务器必须不掩码发送到客户端的所有帧。如果客户端检测到掩码的帧,它必须关闭连接。在这种情况下,它可能使用定义在 7.4.1节的状态码 1002(协议错误)。
4.一个没有分片的消息由单个带有 FIN 位设置(5.2 节)和一个非 0 操作码的帧组成。
5.一个分片的消息由单个带有 FIN 位清零(5.2 节)和一个非 0 操作码的帧
组成,跟随零个或多个带有 FIN 位清零和操作码设置为 0 的帧,且终止于一
个带有 FIN 位设置且 0 操作码的帧。一个分片的消息概念上是等价于单个大
的消息,其负载是等价于按顺序串联片段的负载
6.控制帧(参见 5.5 节)可能被注入到一个分片消息的中间。控制帧本身必须不被分割。
7.消息分片必须按发送者发送顺序交付给收件人。
8.一个消息的所有分片是相同类型,以第一个片段的操作码设置。
9.关闭帧可以包含内容体(“帧的“应用数据”部分)指示一个关闭的原因,例如
端点关闭了、端点收到的帧太大、或端点收到的帧不符合端点期望的格式。如果
有内容体,内容体的头两个字节必须是 2 字节的无符号整数(按网络字节顺序)
代表一个在 7.4 节的/code/值定义的状态码。跟着 2 字节的整数,内容体可以包
含 UTF-8 编码的/reason/值,本规范没有定义它的解释。数据不必是人类可读的
但可能对调试或传递打开连接的脚本相关的信息是有用的。由于数据不保证人类
可读,客户端必须不把它显示给最终用户。
10.在应用发送关闭帧之后,必须不发送任何更多的数据帧。
11.发送并接收一个关闭消息后,一个端点认为 WebSocket 连接关闭了且必须关闭底
层的 TCP 连接。服务器必须立即关闭底层 TCP 连接,客户端应该等待服务器关
闭连接但可能在发送和接收一个关闭消息之后的任何时候关闭连接,例如,如果
它没有在一个合理的时间周期内接收到服务器的 TCP 关闭。
12.一个端点可以在连接建立之后并在连接关闭之前的任何时候发送一个 Ping 帧。注意:一个 Ping 即可以充当一个 keepalive,也可以作为验证远程端点仍可响应

{经验和补充}

1.浏览器目前没有提供js接口发送ping帧,浏览器可能单向的发送pong帧(可以利用文本帧当作ping帧来使用)
2.服务端给浏览器发送ping帧,浏览器会尽快响应同样负载数据的pong帧
3.浏览器发送的websocket负载数据太大的时候会分片
4,不管是浏览器,还是服务器,收到close帧都回复同样内容的close帧,然后做后续的操作

{连接断开情况分析}

server:s
browser:b

0
动作:b发s连接关闭帧,s无操作

现象:
0) b过很久之后触发了onclose
1) s写入: *net.OpError: write tcp 127.0.0.1:8000->127.0.0.1:34508: write: broken pipe
2) s读取: *errors.errorString: EOF

1
动作:b发s连接关闭帧,s回应连接关闭帧

现象:
0) b马上触发了onclose
1) s写入: *net.OpError: write tcp 127.0.0.1:8000->127.0.0.1:34482: write: broken pipe
2) s读取: *errors.errorString: EOF

2
动作:b发s连接关闭帧,s回应连接关闭帧,s关闭tcp socket

现象:
0) b马上触发了onclose
1) s写入: *net.OpError: write tcp 127.0.0.1:8000->127.0.0.1:34502: use of closed network connection
2) s读取: *net.OpError: read tcp 127.0.0.1:8000->127.0.0.1:34502: use of closed network connection

3
动作:s发b连接关闭帧,b无操作
现象:
0) b马上回应相同数据的关闭帧, 接着触发onclose
1) s写入: *net.OpError: write tcp 127.0.0.1:8000->127.0.0.1:34482: write: broken pipe
2) s读取: *errors.errorString: EOF

4
动作:s发b连接关闭帧,s关闭tcp socket
现象:
0) b马上触发了onclose
1) s写入: *net.OpError: write tcp 127.0.0.1:8000->127.0.0.1:34542: use of closed network connection
2) s读取: *net.OpError: tcp 127.0.0.1:8000->127.0.0.1:34542: use of closed network connection