所在的位置: Web开发 >> HTTP >> 细说WebSocketNode篇

细说WebSocketNode篇

在上一篇提高到了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.







































白癜风怎么治疗最好
白癜风医院南宁哪家好



转载请注明:http://www.guyukameng.com/http/8243.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了