教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

基于NETTY引擎的WEBSOCKET 新草案支持

来源:网络收集 时间:2026-08-30
导读: 基于NETTY引擎的WEBSOCKET 新草案支持: 介绍: 首先需要介绍下什么叫做WebSokcet。这个在维基百科上解释的很清楚,WebSocket 是HTML5一种新的协议。 现在很多网站为了实现实时通讯,所采用的技术基本上是轮询策略。即每一个时间间隔,由浏览器像服务器发送

基于NETTY引擎的WEBSOCKET 新草案支持:

介绍:

首先需要介绍下什么叫做WebSokcet。这个在维基百科上解释的很清楚,WebSocket 是HTML5一种新的协议。

现在很多网站为了实现实时通讯,所采用的技术基本上是轮询策略。即每一个时间间隔,由浏览器像服务器发送一个HTTP 请求,服务器收到请求之后,将最新的数据发送给浏览器。应用在EMMA中,就相当于,为了获取实时message信息,由EMMA客户端每隔一个较短的时间间隔向EMMA服务器发送一个getMessage url request,EMMA服务器收到该url request之后,检查database和memory cache,然后将最新的消息发送给客户端。这种处理方法获得的消息带有明显的滞后性(取决于设置的时间间隔大小),并且会浪费带宽和服务器资源(比如没有更新消息,还需要走一遍基本流程)。

现在比较新的轮询技术是Comet,但是普遍采用长链接,也会大量消耗服务器资源。面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。它是实现了浏览器与服务器的双向通讯。在 WebSocket API 中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket技术还在不断的发展阶段,历史上提出了各种协议草案,但是还没有一个稳定的协议供所有浏览器和服务器使用。因此,在浏览器方面,不同的浏览器可以支持不同版本的WebSokcet协议草案,而且传输的数据加密解密方式也不尽相同。在服务器方面,也有支持不同版本WebSocket协议草案的服务器,例如PHP,Jetty,Netty,Ruby,Kaazing。其中,Netty的传输效率最高,也是我们搭建Web Socket Server所采用的通讯服务器引擎。目前,jWebSocket所封装的Netty引擎只能支持到7.x版本的WebSocket协议草案,并不支持10.x版本的新协议。我们对其进行了修改,修复了其中的bug,使之能支持与不同浏览器的通讯。

不同WebSocket协议草案的数据传输

1. WebSocket请求链接格式(head):

Chrome:

GET / HTTP/1.1

Upgrade: websocket

Connection: Upgrade

Host: 127.0.0.1:1337

Sec-WebSocket-Origin: http://127.0.0.1:8000

Sec-WebSocket-Key: erWJbDVAlYnHvHNulgrW8Q==

Sec-WebSocket-Version: 8

Cookie: csrftoken=xxxxxx; sessionid=xxxxx

Firefox:

GET / HTTP/1.1

Host: 127.0.0.1:1337

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:8.0) Gecko/20100101 Firefox/8.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip, deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Connection: keep-alive, Upgrade

Sec-WebSocket-Version: 8

Sec-WebSocket-Origin: http://127.0.0.1:8000

Sec-WebSocket-Key: 1t3F81iAxNIZE2TxqWv+8A==

Cookie: xxx

Pragma: no-cache

Cache-Control: no-cache

Upgrade: websocket

Safari:

GET / HTTP/1.1

Upgrade: WebSocket

Connection: Upgrade

Host: 127.0.0.1:1337

Origin: http://127.0.0.1:8000

Cookie: sessionid=xxxx; calView=day; dayCurrentDate=1314288000000

Sec-WebSocket-Key1: cV`p1* 42#7 ^9}_ 647 08{

Sec-WebSocket-Key2: O8 415 8x37R A8 4

;"######

IE7

GET / HTTP/1.1

Upgrade: WebSocket

Connection: Upgrade

Host: 127.0.0.1:1337

Origin: http://127.0.0.1:8000

Cookie: sessionid=xxxx; calView=day; dayCurrentDate=1314288000000

Sec-WebSocket-Key1: cV`p1* 42#7 ^9}_ 647 08{

Sec-WebSocket-Key2: O8 415 8x37R A8 4

;"######

IE8

GET / HTTP/1.1

Host: 127.0.0.1:1337

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:8.0) Gecko/20100101 Firefox/8.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip, deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Connection: keep-alive, Upgrade

Sec-WebSocket-Version: 8

Sec-WebSocket-Origin: http://127.0.0.1:8000

Sec-WebSocket-Key: 1t3F81iAxNIZE2TxqWv+8A==

Cookie: xxx

Pragma: no-cache

Cache-Control: no-cache

Upgrade: websocket

对于协议草案7.x之前的版本,只包含有一个key,一般浏览器已经不支持7.x以前的版本;对于协议草案7.x(Safari和IE7),链接请求中包含有3个key,分别是Sec-WebSocket-Key1,Sec-WebSocket-Key2以及在报头末尾的一串字符;对于协议草案10.x(Chrome,Firefox, IE8)又回归到只有一个key:Sec-WebSocket-Key,但另外多了Sec-WebSocket-Version,Sec-WebSocket-Origin两个相关域。因此,对于一个WebSocket链接请求,只要判断存在Sec-WebSocket-Key,Sec-WebSocket-Version和Sec-WebSocket-Origin三个域,则可以确定是10.x草案,而包含有Sec-WebSocket-Key1和Sec-WebSocket-Key2两个域则可以确定是7.x草案

2.数据传输格式:

在收到浏览器发送的WebSocket请求链接消息之后,服务器需要根据收到的key,计算出accept key返回给浏览器,浏览器验证accept key如果正确,则可以正确建立链接。不同协议草案计算accept key的方法和加密格式都不尽相同。

对于协议7.x,以Safari的输入为例:取出Sec-WebSocket-Key1中的所有数字字符形成一个数值,这里是1427964708,然后除以Key1中的空格数目,这里好像是6个空格,得到一个数值,保留该数值整数位,得到数值N1;对Sec-WebSocket-Key2如法炮制,得到第二个整数N2;把N1和N2按照Big-Endian字符序列连接起来,然后再与另外一个Key3连接,得到一个原始序列ser_key。那么Key3是什么呢?大家可以看到在Safari发送过来的握手请求最后,有一个8字节的奇怪的字符串“;”######”,这个就是Key3。回到ser_key,对这个原始序列做md5算出一个16字节长的digest,这就是老版本协议需要的accept key,然后将这个token附在握手消息的最后发送回Client,即可完成握手。

对于协议10.x,生成accept key的方法比较简单:首先把Sec-WebSocket-Key和一串固定的UUID “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”做拼接,然后对这个拼接后的字符串做SHA1加密,得到digest以后,做一次base64编码,即可获得Token。

完成握手只是WebSocket Server的一半功能,现在只能保证这个Server能够和两个版本的浏览器建立链接了,但是如果试着把Chrome中的消息发送给Safari,会发现Safari无法接收。导致这个结果的原因,是因为两个版本的协议的Data Framing结构不同,也即是在握手建立连接后,Client发送和接收的数据结构都不一样。

首先第一步需要获取不同版本协议下Client发送过来的原始数据。老版本协议比较简单,实际上就是在原始数据前加了个’\x00′,在最后面加上了一个’\xFF’,所以如 …… 此处隐藏:3201字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于NETTY引擎的WEBSOCKET 新草案支持.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1803214.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)