在上一篇提高到了web通信的各种方式,包括轮询、长连接以及各种HTML5中提到的手段。本文将详细描述WebSocket协议在web通讯中的实现。
一、WebSocket协议1.概述websocket协议允许不受信用的客户端代码在可控的网络环境中控制远程主机。该协议包含一个握手和一个基本消息分帧、分层通过TCP。简单点说,通过握手应答之后,建立安全的信息管道,这种方式明显优于前文所说的基于XMLHTTPRequest的iframe数据流和长轮询。该协议包括两个方面,握手链接(handshake)和数据传输(datatransfer)。
2.握手连接这部分比较简单,就像路上遇到熟人问好。
Client:嘿,大哥,有火没?(烟递了过去)Server:哈,有啊,来~(点上)Client:火柴啊,也行!(烟点上,验证完毕)握手连接中,client先主动伸手:
GET/chatHTTP/1.1Host:server.example. ws.send(握手成功);};运行代码
Server收到的信息是这样的:
一个放在Buffer格式的二进制流。而当我们输出的时候解析这个二进制流:
//服务器程序varcrypto=require(crypto);varWS=EAFA5-E91-7DA-95CA-C5AB0DC85B11;require(net).createServer(function(o){varkey;o.on(data,function(e){if(!key){//握手key=e.toString().match(/Sec-WebSocket-Key:(.+)/)[1];key=crypto.createHash(sha1).update(key+WS).digest(base6);o.write(HTTP/1.SwitchingProtocols\r\n);o.write(Upgrade:websocket\r\n);o.write(Connection:Upgrade\r\n);o.write(Sec-WebSocket-Accept:+key+\r\n);o.write(\r\n);}else{//输出之前解析帧console.log(decodeDataFrame(e));};});}).listen();那输出的就是一个帧信息十分清晰的对象了:
5.连接的控制上面我买了个关子,提到的Opcode,没有详细说明,官方文档也给了一张表:
Opcode
Meaning
Reference
-+--------+-------------------------------------+-----------
0
ContinuationFrame
RFC
-+--------+-------------------------------------+-----------
1
TextFrame
RFC
-+--------+-------------------------------------+-----------
2
BinaryFrame
RFC
-+--------+-------------------------------------+-----------
8
ConnectionCloseFrame
RFC
-+--------+-------------------------------------+-----------
9
PingFrame
RFC
-+--------+-------------------------------------+-----------
10
PongFrame
RFC
-+--------+-------------------------------------+-----------
decodeDataFrame解析数据,得到的数据格式是:
{FIN:1,Opcode:1,Mask:1,PayloadLength:,MaskingKey:[,18,,9],PayLoadData:握手成功}那么可以对应上面查看,此帧的作用就是发送文本,为文本帧。因为连接是基于TCP的,直接关闭TCP连接,这个通道就关闭了,不过WebSocket设计的还比较人性化,关闭之前还跟你打一声招呼,在服务器端,可以判断frame的Opcode:
varframe=decodeDataFrame(e);console.log(frame);if(frame.Opcode==8){o.end();//断开连接}客户端和服务端交互的数据(帧)格式都是一样的,只要客户端发送ws.close(),服务器就会执行上面的操作。相反,如果服务器给客户端也发送同样的关闭帧(closeframe):
o.write(encodeDataFrame({FIN:1,Opcode:8,PayloadData:buf}));客户端就会相应onclose函数,这样的交互还算是有规有矩,不容易出错。
二、注意事项1.WebSocketURIs很多人可能只知道ws://text.白癜风怎么治疗最好白癜风医院南宁哪家好