0D 0A 0D 0A, 也就是用"\r\n\r\n"收尾, 这和http头没什么区别. 转换成字符串就是:
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 192.168.8.128:1300
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36
其中有一对重要的kv, 就是Sec-WebSocket-Key: d359Fdo6omyqfxyYF7Yacw==, 看上去是一个base64编码后的结果, 服务器需要对这个sec-key作一些处理, 并返回握手响应, 这个处理是:
byte[]sha=sha1(("d359Fdo6omyqfxyYF7Yacw=="+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes());
System.out.println(newString(Base64.getEncoder().encode(sha)));
也就是原封不动的拿着这个sec-key和另一个神奇的字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"相连, 再经过sha1摘要
算法处理, 最后再经过base64编码输出即可, 上面的输出结果应该是: pLO2KC7b5t0TZl1E6A3sqJ6EzU4=
服务器在收到握手请求后, 如果愿意提供服务, 则返回一个握手响应, 如下:
HTTP/1.1101SwitchingProtocols
Connection:Upgrade
Upgrade:WebSocket
Sec-WebSocket-Accept:pLO2KC7b5t0TZl1E6A3sqJ6EzU4=
遵循http的规则, 字节流上一样是要以"\r\n\r\n"收尾.
二. 数据帧
rfc6455上叫做非控制帧, 除了非控制帧之外, 就是控制帧. 包括connection close, ping, pong等帧, 这里只讲非控制帧, 也就是数据帧.
数据帧从长度上可以分为三种. 帧中的静荷数据(payload data)长度小于0x7E的为小帧, 静荷数据长度 >=0x7E又<=0x10000的为中帧,
再长的叫大帧.
数据帧从类型上暂时可以分为两种, 文本帧和二进制帧.
例子:
a). 一个从客户端发向服务端的小帧.
82B06AF7C6300AD9C634D41878C16EF5..j..0...4..x.n.
C6306CD5CC102387AF483CA29C6401.0l...#..H<..d..
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-37527-2.html
咋回去呢