`
CshBBrain
  • 浏览: 650242 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:144933
Group-logo
HTML5移动开发
浏览量:137880
社区版块
存档分类
最新评论

WebSocket科普

 
阅读更多

  WebSocket为何物?如果你现在还不太清楚请先到baidu百科一下。如果你实在懒得起搜索的话,下面帮你从网络上搜罗了些许有关WebSocket的信息。

  Baidu百科:http://baike.baidu.com/view/3623887.htm (下面摘录了些许内容,内容来自Baidu)

  WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的应用类型,例如实时的数据推送(股票行情),游戏,聊天/im 等.

  背景:目前在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

原理:websocket规范由两部分组成,一部分是浏览器中的 websocket api, 由w3c 制订, 一部分是websocket 协议, 由ietf制订,目前是draft状态.websocket的协议比较简单, 客户端和普通的浏览器一样通过80或者443端口和服务器进行请求握手,服务器根据http header识别是否一个websocket请求,如果是,则将请求升级为一个websocket连接,握手成功后就进入双向长连接的数据传输阶段. websocket的数据传输是基于帧的方式: 0x00 表示数据开始, 0xff表示数据结束,数据以utf-8编码.


握手协议:

在实现websocket连线过程中,需要透过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” (handshaking)。

  PS1:握手协议在后期的版本中,会标明版本编号,下面的例子属于早期的协定之一,对于新版的 chrome 和 Firefox 皆不适用。

  PS2:后期的版本大多属于功能上的扩充,例如使用第7版的握手协议同样也适用于第8版的握手协议。

  例子:

  浏览器请求

  GET /demo HTTP/1.1

  Host: 你的网址.com

  Connection: Upgrade

  Sec-WebSocket-Key2: 12998 5 Y3 1 .P00

  Sec-WebSocket-Protocol: sample

  Upgrade: WebSocket

  Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5

  Origin: http://你的网址.com

  ^n:ds[4U

  服务器回应

  HTTP/1.1 101

  WebSocket Protocol Handshake

  Upgrade: WebSocket

  Connection: Upgrade

  Sec-WebSocket-Origin: http://你的网址.com

  Sec-WebSocket-Location: ws://你的网址.com/demo

  Sec-WebSocket-Protocol: sample

  8jKS’y:G*Co,Wxa-


支持的浏览器


  目前实现了websocket的浏览器:

  

Chrome Supported in version 4+

Firefox Supported in version 4+

Internet Explorer Supported in version 10+

Opera Supported in version 10+

Safari Supported in version 5+


支持的服务器


  在服务器端,也出现了一些实现websocket协议的项目:

  jetty 7.0.1 包含了一个初步的实现

  resin 包含有websocket 实现

  pywebsocket, apache http server 扩展

  apache tomcat 7.0.27 版本

  websocket api在浏览器端的广泛实现似乎只是一个时间问题了, 值得注意的是目前服务器端没有标准的api, 各个实现都有自己的一套api, 并且jcp也没有类似的提案, 所以使用websocket开发服务器端有一定的风险.可能会被锁定在某个平台上或者将来被迫升级.


  Baidu百科对Websocket做了基本的介绍。WebSocket是html5的一部分,而html5标准还处于制定过程中。根据网上的信息得知到2014年底,HTML5才将成为一种完整的成品标准(来自 http://www.iteye.com/news/26113),W3C计划到2016年底发布后续版本HTML 5.1。而且 新的HTML 5.1将包含较少的技术,曾经包含在HTML 5之下的Web Workers 和WebSockets现在都将成为单独标准。可见websocket还处于一个快速发展变化的过程中。

  从WebSocket的协议的握手处理和数据传输格式的快速变化可窥其一斑。WebSocket协议握手处理和消息格式的变迁(来自网络:http://lchshu001.iteye.com/blog/1184428

 

1.握手协议 
版本0--3中: 
握手通过请求头Sec-WebSocket-Key1 和 Sec-WebSocket-Key2 的值和 8 字节的请求实体,进行MD5加密,将加密结果,构造出一个16字节作为请求实体的内容返回。如下实例: 
------------------请求-------------------------------------------- 

  1. GET /demo HTTP/1.1  
  2. Host: example.com  
  3. Connection: Upgrade  
  4. Sec-WebSocket-Key2: 12998 5 Y3 1  .P00  
  5. Sec-WebSocket-Protocol: sample  
  6. Upgrade: WebSocket  
  7. Sec-WebSocket-Key1: 4 @1  46546xW%0l 1 5  
  8. Origin: http://example.com  
  9. (\r\n)  
  10. ^n:ds[4U  


------------------响应-------------------------------------------- 

  1. HTTP/1.1 101 WebSocket Protocol Handshake  
  2. Upgrade: WebSocket  
  3. Connection: Upgrade  
  4. Sec-WebSocket-Origin: http://example.com  
  5. Sec-WebSocket-Location: ws://example.com/demo  
  6. Sec-WebSocket-Protocol: sample  
  7. (\r\n)  
  8. 8jKS'y:G*Co,Wxa-  

 


------------------------------------------------------------------ 

把第一个Key中的数字除以第一个Key的空白字符的数量,而第二个Key也是如此,这样得到两个整数,把每个整数写的四个字节里去,串为8个字节,然后和请求实体里面的8个字节串为16字节,将这16个字节进行MD5加密(如实例中的结果:8jKS'y:G*Co,Wxa-),得到一个16字节的数据作为响应实体的内容,返回给客户端,这样握手成功。 


在版本4之后,握手协议修改了: 
------------------请求-------------------------------------------- 

  1. GET /chat HTTP/1.1  
  2. Host: server.example.com  
  3. Upgrade: websocket  
  4. Connection: Upgrade  
  5. Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==  
  6. Sec-WebSocket-Origin: http://example.com  
  7. Sec-WebSocket-Protocol: chat, superchat  
  8. (\r\n)  



------------------响应-------------------------------------------- 

  1. HTTP/1.1 101 Switching Protocols  
  2. Upgrade: websocket  
  3. Connection: Upgrade  
  4. Sec-WebSocket-Accept: me89jWimTRKTWwrS3aRrL53YZSo=  
  5. Sec-WebSocket-Nonce: AQIDBAUGBwgJCgsMDQ4PEC==  
  6. Sec-WebSocket-Protocol: chat  

 



使用请求头的值 Sec-WebSocket-Key,该值是BASE-64编码(base64-encoded)的,我们不需要转码,加上一个魔幻字符串: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",(结果:[dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11])使用 SHA-1 加密,之后进行 BASE-64编码,将结果做为 Sec-WebSocket-Accept 头的值,返回给客户端。 
如果服务器端有 Sec-WebSocket-Nonce 头,表示要在Sec-WebSocket-Key 的值,和魔幻字符串之间加入该 Sec-WebSocket-Nonce 头的值,即“dGhlIHNhbXBsZSBub25jZQ==AQIDBAUGBwgJCgsMDQ4PEC==258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,进行 SHA-1 加密,之后和前面的相同。完成握手协议。 

2.消息帧格式

在版本 0 中, 数据帧比较的简单。数据帧以 0x00 开头,以0xFF结尾,中间的数据以utf-8编码的字符就可以了。当然这个简单的格式只能用来传输字符串。无法传输字节流。所以 版本 1 就做了修改了,后面的版本绝大部分是兼容的。 
后面的这个帧结构就有点复杂了,如下所示(一行是4个字节,32 bit): 

  1.  0                   1                   2                   3  
  2.  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  3. +-+-+-+-+-------+-+-------------+-------------------------------+  
  4. |M|R|R|R| opcode|R| Payload len |    Extended payload length    |  
  5. |O|S|S|S|  (4)  |S|     (7)     |             (16/63)           |  
  6. |R|V|V|V|       |V|             |   (if payload len==126/127)   |  
  7. |E|1|2|3|       |4|             |                               |  
  8. +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +  
  9. |     Extended payload length continued, if payload len == 127  |  
  10. + - - - - - - - - - - - - - - - +-------------------------------+  
  11. |                               |         Extension data        |  
  12. +-------------------------------+ - - - - - - - - - - - - - - - +  
  13. :                                                               :  
  14. +---------------------------------------------------------------+  
  15. :                       Application data                        :  
  16. +---------------------------------------------------------------+  


[MORE] 表示一个数据通过多个帧进行传输, 如果是 0 表示后面还有数据帧,如果是 1 则表示是最后一个帧。 
[RSV1][RSV2][RSV3][RSV4] 未做定义暂时全为零。 
[opcode] 标识数据的格式,以及帧的控制,如:08标识数据内容是 文本,01标识:要求远端去关闭当前连接。 
[Payload len] 如果小于126 表示后面的数据长度是 [Payload len] 的值。(最大125byte) 
              等于 126 表示之后的16 bit位的数据值标识数据的长度。(最大65535byte) 
              等于 127 表示之后的64 bit位的数据值标识数据的长度。(一个有符号长整型的最大值) 
[Extension data]没有提及怎么使用。 
[Application data] 为应用提供的数据。 

版本7之后,添加了 MASK 的概念。相当于对数据加密。而且要求客户端必须是MASK的。 

  1.  0                   1                   2                   3  
  2.  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  3. +-+-+-+-+-------+-+-------------+-------------------------------+  
  4. |F|R|R|R| opcode|M| Payload len |    Extended payload length    |  
  5. |I|S|S|S|  (4)  |A|     (7)     |             (16/63)           |  
  6. |N|V|V|V|       |S|             |   (if payload len==126/127)   |  
  7. | |1|2|3|       |K|             |                               |  
  8. +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +  
  9. |     Extended payload length continued, if payload len == 127  |  
  10. + - - - - - - - - - - - - - - - +-------------------------------+  
  11. |                               |Masking-key, if MASK set to 1  |  
  12. +-------------------------------+-------------------------------+  
  13. | Masking-key (continued)       |          Payload Data         |  
  14. +-------------------------------- - - - - - - - - - - - - - - - +  
  15. :                     Payload Data continued ...                :  
  16. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +  
  17. |                     Payload Data continued ...                |  
  18. +---------------------------------------------------------------+  

 


[opcode]  01标识数据内容是 文本,08标识 : 要求远端去关闭当前连接。 
[MASK](即原先的RSV4)如果是 1 则数据是被 MASK 的。 
[Masking-key] 如果MASK为 1 则有4字节的 Masking-key,用于与传输的数据 [Payload Data] 进行异或运算,4byte(32bit)进行一次运算,不足四位从前往后对应,如只有三位,则只与[Masking-key]的前三位进行运算。 

 

3.关闭远端连接:
在版本 0 时:传两个字节 (0xff,0x00); 
在版本 1--6 时:传三个字节 (0x80,0x01,0x00); 
在版本 7--以上 时:传两个字节 (0x88,0x00); 
经测试 只有 在版本 7--以上 时:传两个字节 (0x88,0x00)。

  以上 WebSocket握手协议处理,消息格式和关闭远端的变迁摘录自网络。

 

Websocket协议草案:http://tools.ietf.org/html/rfc6455 ;如果你对自己的E文有足够的信心,有足够的时间你可以去阅读翻译WebSocket协议。协议草案版本更新的很频繁。

 

尽管Websocket协议还处于一个快速进化发展的过程中,但我们不能等到他完全成熟之后再去学习使用他。因为移动互联网时代的道来,我们真的很需要他。

 

Html5支持的WebSocket AIP:(一下内容摘自:http://edu.cnzz.cn/Webmaster/Site/2/2012/0807/31898.html)

 

WebSocket 的js API是非常的简单:

见上图:ready state中定义的是socket的状态,分为connection、open、closing和closed四种状态,从字面上就可以区分出它们所代表的状态。

上图描述的是WebSocket的事件,分为onopen、onerror和onclose;

上图为消息的定义,主要是接收和发送消息。注意:可以发送二进制的数据。

以上个图的具体的含义就不再一一赘述,详细描述请参考:http://www.w3.org/TR/2012/WD-websockets-20120524/

PS:由于WebSocket API(截止到2012年7月)还是草案,API文档和上文所描述的会有所不同,请以官方文档为主,这也是我为什么不详细描述API中各个属性的原因。

另外一点需要提醒大家的是:在前端开发中,浏览器兼容是必不可少的,而WebSocket在主浏览器中的兼容还是不错的,火狐和Chrome不用说,最新版的支持非常不错,而且支持二进制数据的发送和接收。

下面给出一个html中的实例:(一下内容摘自:http://www.sztaixie.com/blackie/?p=123

 

下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。

// 创建一个Socket实例
var socket = new WebSocket(‘ws://localhost:8080′); 

 

// 打开Socket
socket.onopen = function(event) {

// 发送一个初始化消息
socket.send(‘I am the client and I\’m listening!’);

// 监听消息
socket.onmessage = function(event) {
console.log(‘Client received a message’,event);
};

// 监听Socket的关闭
socket.onclose = function(event) {
console.log(‘Client notified socket has closed’,event);
};

// 关闭Socket….
//socket.close()
};

让我们来看看上面的初始化片段。参数为URL,ws表示WebSocket协议。onopen、onclose和onmessage方法把事件连接到Socket实例上。每个方法都提供了一个事件,以表示Socket的状态。

onmessage事件提供了一个data属性,它可以包含消息的Body部分。消息的Body部分必须是一个字符串,可以进行序列化/反序列化操作,以便传递更多的数据。

WebSocket的语法非常简单,使用WebSockets是难以置信的容易……除非客户端不支持WebSocket。

此文针对网络上的websocket资料进行了一些整理以方便将要学习研究Websocket的同学。
分享到:
评论

相关推荐

    基于springboot的冬奥会科普平台系统源码.zip

    在描述中提到的“基于SpringBoot的冬奥会科普平台系统”是一个典型的Web应用案例,主要目标是为公众提供关于冬季奥运会的知识普及和信息交流。这个平台可能包括以下几个关键模块: 1. 用户管理:用户注册、登录、...

    目前常用的抓包改包工具的基础科普与纵深对比分析

    它允许用户实时监控WebSocket连接,捕获和解析数据包,同时提供修改和重放功能,对于测试WebSocket应用的开发和调试非常有帮助。 3. IE HTTP Analyzer:这款工具专注于Internet Explorer浏览器的HTTP流量捕获,提供...

    springboot基于SpringBoot的冬奥会科普平台--论文.rar

    此外,SpringBoot还支持自动配置Spring模块和其他第三方库,如数据访问、安全、WebSocket等。 在这个项目中,我们可以看到以下几个关键的技术点: 1. **MVC架构**:SpringBoot提供了基于注解的MVC框架,使得控制器...

    基于SpringBoot的冬奥会科普平台.zip

    【标题】"基于SpringBoot的冬奥会科普平台"项目是一个综合性的技术实现,旨在利用现代Web技术和Java后端框架SpringBoot来构建一个普及冬季奥林匹克运动会知识的在线平台。这个平台不仅展示了SpringBoot的强大功能,...

    基于微信小程序的发酵过程在线监测系统设计.pdf

    微信小程序作为一种新型的移动应用形式,以其便捷性和普及性,在本系统中扮演了客户端的角色,而Websocket技术则用于建立服务器与客户端之间的实时双向通信。同时,Java语言用于开发服务端,确保了系统的稳定性和...

    “青松访”心理健康服务微信小程序的设计与实现.zip

    这些量表需要经过专业人员的校准和验证,确保其科学性和准确性。同时,小程序还需要具备数据分析能力,对用户的测试结果进行统计分析,提供个性化的反馈和建议。 在线咨询功能则需要考虑实时性与稳定性。可以利用...

    基于Android的牙科综合服务系统的设计与实现.pdf

    - **开发环境与技术**:使用JDK 1.8、Tomcat服务器、SpringBoot、MyBatis作为后端框架,Netty用于部分功能实现,以及WebSocket保持与客户端的实时通讯。客户端开发使用Android Studio 3.5,接口测试工具为Postman,...

    毕设&课程作业_智慧图书馆系统.zip

    除此之外,项目还可能涉及其他技术,如集成第三方API(如地图API用于定位图书馆位置)、使用WebSocket实现实时通信(如图书状态更新通知)、部署与运维技术(如Docker容器化、Kubernetes集群管理)等。 整个智慧...

    行业分类-设备装置-多媒体知识竞赛抢答系统.zip

    3. **社区活动**:增强邻里之间的交流,普及科普知识,活跃社区文化氛围。 4. **节省成本**:相比于传统的实物抢答器,软件系统降低了硬件投入,且易于维护更新。 综上,《多媒体知识竞赛抢答系统》以其强大的功能...

    基于java Web的心理健康在线测评系统

    2.5 知识库:包含心理健康相关的文章、资讯,为用户提供科普知识。 2.6 在线咨询:集成即时通讯功能,用户可以与专业心理咨询师进行线上交流。 三、关键技术实现 3.1 Spring Security:提供用户认证和授权,确保...

    planetarium.rar

    "img"目录通常存放图片资源,这些图片可能是用于背景、图标或是科普教育内容的插图。HTML5的`<picture>`元素和`srcset`属性支持响应式图像,可以根据设备的分辨率和屏幕尺寸提供不同大小的图像,优化加载速度和用户...

    基于HTML5绿色环保网站源码数据库.zip

    5. SpringBoot:了解其核心概念,如SpringMVC、AOP、WebSocket等,并学会配置微服务和集成测试。 6. 数据库:可能涉及到MySQL或其他关系型数据库,学习SQL查询语言,理解数据库设计和优化。 7. 微信小程序:学习...

    人机交互项目

    人机交互(Human-Computer Interaction, 简称HCI)是一项综合性的学科,涉及计算机科学、心理学、设计学以及工程等多个领域。在这个“人机交互项目”中,我们重点探讨如何利用JavaScript技术来提升用户体验,创造...

    大数据可视化理论及技术.zip

    总之,大数据可视化理论及技术是数据科学的重要组成部分,它结合了计算机科学、信息设计和统计学的原理,旨在通过视觉手段提升大数据的理解和决策效率。随着技术的发展,大数据可视化将持续演进,为各行业带来更直观...

    基于Python的网络聊天室的设计与实现.docx

    随着互联网的普及,人们对于在线沟通的需求日益增加,网络聊天室作为社交平台的重要组成部分,为用户提供了一个实时交流的平台。Python作为一门动态且强大的编程语言,具备良好的网络编程支持,如Socket编程库,使得...

    常用易语言编程模块

    7. 数学计算模块:提供数学运算和算法支持,例如矩阵运算、随机数生成、几何图形计算等,适用于科学计算或游戏开发等领域。 通过这些模块,初学者可以避免从零开始编写基础功能,而专注于解决具体问题,从而加速...

    8套大数据界面html工程 开箱即用!

    在当前的数字化时代,大数据已经成为了企业决策、科学研究和日常生活中不可或缺的一部分。为了更好地展示、分析和理解这些海量数据,一套高效且直观的用户界面至关重要。"8套大数据界面html工程 开箱即用!" 提供了...

    计算机软件-商业源码-基于PocketBuilder的掌上移动设备程序设计.zip

    掌上移动设备程序设计是计算机科学的一个重要领域,特别是在当今智能手机和平板电脑普及的时代。PocketBuilder是一款强大的跨平台开发工具,允许开发者创建针对多种移动设备的应用程序,包括早期的Palm OS设备以及...

    Python库 | pewlib-0.7.2-py3-none-any.whl

    通常,Python库会专注于特定领域,如数据处理、网络编程、科学计算、Web开发等。`pewlib`可能包含一系列的函数和类,帮助开发者处理常见的问题或提供独特的功能。 Python的Wheel文件是一种二进制分发格式,它允许...

Global site tag (gtag.js) - Google Analytics