websocket通讯过程:
websocket客户端首先发起一个连接请求,发送的数据格式如下:
GET /10.15.1.218:12345/chat?key=value\r\n
HTTP/1.1\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Host: 10.15.1.218:12345\r\n
Sec-WebSocket-Origin: null\r\n
Sec-WebSocket-Key: 4tAjitqO9So2Wu8lkrsq3w==\r\n
Sec-WebSocket-Version: 8\r\n\r\n
这是类似于HTTP的头,注意每行数据结尾结束符是”\r\n”, 最后的结束符是”\r\n\r\n”。
请求头第1行详解:
“GET /”后面是服务器的IP和端口(10.15.1.218:12345)必须有。’/’的后面是你自己字符串,(chat),随便你传什么,这部分是可选的。字符串 ‘?’后面是一些参数(key=value),是什么你自己定义, 这部分也是可选的。像下面这三种都是合法的:
GET /10.15.1.218:12345\r\n
或者
GET /10.15.1.218:12345/chat\r\n
或者
GET /10.15.1.218:12345/chat?key=value\r\n
第2, 3, 4, 5, 6行:
HTTP/1.1\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Host: 10.15.1.218:12345\r\n
Sec-WebSocket-Origin: null\r\n
这些都基本是固定的格式与内容,Host: 后面是服务器(被连接者)的IP和Port。
第7行:
Sec-WebSocket-Key: 4tAjitqO9So2Wu8lkrsq3w==\r\n
Sec-WebSocket-Key后面的那一串东西,那一串长度为24的字符串是客户端随机生成的,我们暂时叫他cli_key,服务器必须用它经过一定的运算规则生成服务器端的key,暂时叫做ser_key,然后把ser_key发回去,客户端验证正确后,握手成功!
第8行:
Sec-WebSocket-Version: 8\r\n\r\n
之所以版本为8的原因,我不太清楚。10版本的通讯协议中客户端发出的都是8。
chrome 14浏览器中实现了websocket客户端,不用自己实现。可以去下载一个,当websocket客户端用。
2.制作服务端的密钥
我们的服务器将key1(长度24)截取出来
4tAjitqO9So2Wu8lkrsq3w==
用它和自定义的一个字符串(长度36):
258EAFA5-E914-47DA-95CA-C5AB0DC85B11
连接起来,像这样:
4tAjitqO9So2Wu8lkrsq3w==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
然后把这一长串经过SHA-1算法加密,得到长度为20字节的二进制数据,
再将这些数据经过Base64编码,最终得到服务端的密钥,也就是ser_key:
bEVeGLZrb9fS3Rj8WzExJdCsedg=
3.服务端返回密钥
然后需要把密钥返回给客户端,完成握手,发送的数据格式如下:
HTTP/1.1 101 Switching Protocols\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: bEVeGLZrb9fS3Rj8WzExJdCsedg=\r\n\r\n
至此,算是握手成功了!
代码:http://download.csdn.net/detail/chuanyu/8795675
http://levi.cg.am/archives/1759