- 浏览: 650242 次
- 性别:
- 来自: 成都
最新评论
-
zhima:
楼主还在升级开发吗?还是地址变动了
开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布 -
linxingliang:
你好,我有一个iteye账号也被锁定了,你是通过什么方式联系管 ...
今天由于iteye账号被锁定所有博文不能访问,已解锁 -
独自空楼茉莉为谁而开:
解决啦,仿照你的广播发送写的代码 嘿嘿
开源WebSocket服务器项目 宝贝鱼(CshBBrain)版本发布 -
独自空楼茉莉为谁而开:
小弟有一个问题 我在本地开启两个页面访问后台,后台稍微修改下代 ...
开源WebSocket服务器项目 宝贝鱼(CshBBrain)版本发布 -
spqin:
...
百度地图API详解之地图标注
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字节作为请求实体的内容返回。如下实例:
------------------请求--------------------------------------------
- GET /demo HTTP/1.1
- Host: example.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://example.com
- (\r\n)
- ^n:ds[4U
------------------响应--------------------------------------------
- HTTP/1.1 101 WebSocket Protocol Handshake
- Upgrade: WebSocket
- Connection: Upgrade
- Sec-WebSocket-Origin: http://example.com
- Sec-WebSocket-Location: ws://example.com/demo
- Sec-WebSocket-Protocol: sample
- (\r\n)
- 8jKS'y:G*Co,Wxa-
------------------------------------------------------------------
把第一个Key中的数字除以第一个Key的空白字符的数量,而第二个Key也是如此,这样得到两个整数,把每个整数写的四个字节里去,串为8个字节,然后和请求实体里面的8个字节串为16字节,将这16个字节进行MD5加密(如实例中的结果:8jKS'y:G*Co,Wxa-),得到一个16字节的数据作为响应实体的内容,返回给客户端,这样握手成功。
在版本4之后,握手协议修改了:
------------------请求--------------------------------------------
- GET /chat HTTP/1.1
- Host: server.example.com
- Upgrade: websocket
- Connection: Upgrade
- Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
- Sec-WebSocket-Origin: http://example.com
- Sec-WebSocket-Protocol: chat, superchat
- (\r\n)
------------------响应--------------------------------------------
- HTTP/1.1 101 Switching Protocols
- Upgrade: websocket
- Connection: Upgrade
- Sec-WebSocket-Accept: me89jWimTRKTWwrS3aRrL53YZSo=
- Sec-WebSocket-Nonce: AQIDBAUGBwgJCgsMDQ4PEC==
- 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):
- 0 1 2 3
- 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
- +-+-+-+-+-------+-+-------------+-------------------------------+
- |M|R|R|R| opcode|R| Payload len | Extended payload length |
- |O|S|S|S| (4) |S| (7) | (16/63) |
- |R|V|V|V| |V| | (if payload len==126/127) |
- |E|1|2|3| |4| | |
- +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
- | Extended payload length continued, if payload len == 127 |
- + - - - - - - - - - - - - - - - +-------------------------------+
- | | Extension data |
- +-------------------------------+ - - - - - - - - - - - - - - - +
- : :
- +---------------------------------------------------------------+
- : Application data :
- +---------------------------------------------------------------+
[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的。
- 0 1 2 3
- 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
- +-+-+-+-+-------+-+-------------+-------------------------------+
- |F|R|R|R| opcode|M| Payload len | Extended payload length |
- |I|S|S|S| (4) |A| (7) | (16/63) |
- |N|V|V|V| |S| | (if payload len==126/127) |
- | |1|2|3| |K| | |
- +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
- | Extended payload length continued, if payload len == 127 |
- + - - - - - - - - - - - - - - - +-------------------------------+
- | |Masking-key, if MASK set to 1 |
- +-------------------------------+-------------------------------+
- | Masking-key (continued) | Payload Data |
- +-------------------------------- - - - - - - - - - - - - - - - +
- : Payload Data continued ... :
- + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- | Payload Data continued ... |
- +---------------------------------------------------------------+
[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)
下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。
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。
发表评论
-
jQuery那些有用的选择方式
2013-01-21 20:02 1010摘自网络: $("[id^=percent]& ... -
基于宝贝鱼(CshBBrain)开发聊天类应用 群发消息的问题
2013-01-12 09:30 2423最近有网友 基于宝贝鱼(CshBBrain)开发聊天类应用 遇 ... -
JS字符串函数
2012-12-15 16:03 1366JS自带函数concat将两个或多个字符的文本组合起来,返回一 ... -
今天由于iteye账号被锁定所有博文不能访问,已解锁
2012-12-04 17:47 1958今天发布了开源WebSocket项目 宝贝鱼 CshBBr ... -
开源WebSocket服务器项目 宝贝鱼(CshBBrain)版本V4.0.2 和 V2.0.3发布
2012-12-04 10:23 2089宝贝鱼 CshBBrain V4.0.2 和 CshBB ... -
开源WebSocket服务器项目 宝贝鱼(CshBBrain) 前台js 框架CshBBrainJS V1.0.0发布(有图有真相)
2012-12-04 09:48 2950为了更好的支持开发基于Websocket的应用,开源Web ... -
基于开源WebSocket服务器宝贝鱼(CshBBrain)的应用横空出世
2012-12-04 10:24 2809开源WebSocket服务器 宝贝鱼(CshBBrain) ... -
HTML事件列表
2012-12-01 10:39 1043一下内容来自网络: 一般事件:onClick HTML ... -
JS编码解码函数
2012-11-23 16:16 1278js 对文字进行编码涉及3个函数:escape,enco ... -
开源WebSocket服务器项目宝贝鱼CshBBrain发布新版本,修复重大广播消息缺陷
2012-11-13 10:16 2740开源WebSocket服务器项目 ... -
开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布
2012-11-13 09:57 2128开源WebSocket服务器项目宝贝鱼CshBBrain ... -
手机界面设计中9种常用的布局
2012-11-12 09:11 2020转自:http://reynold.cn/?p=422 ... -
Web开发者的最爱 5个超实用的HTML5 API
2012-11-09 13:19 1271转自:http://www.csdn.net/article/ ... -
JAVA AIO扫盲和入门
2012-11-05 13:33 9723开源WebSocket服务器 宝贝鱼(CshBBrain) ... -
国内首款基于AIO(异步IO)支持集群的高性能开源WebSocket服务器 宝贝鱼 CshBBrain V4.0 发布
2012-11-05 11:29 3654国内首款基于AIO的开源WebSocket服务器 宝贝鱼 ... -
开源WebSocket服务器项目CshBBrain 中文名:宝贝鱼
2012-11-03 14:38 1749有人叫我给 开源WebSocket服务器项目CshBBrain ... -
开源WebSocket服务器项目CshBBrain V2.0.1发布
2012-11-02 21:22 1633CshBBrain V2.0.1: ... -
高性能I/O设计模式Reactor和Proactor
2012-10-26 17:41 2368转自:http://hi.baidu.com/qhpgb ... -
Proactor和Reactor模式_继续并发系统设计的扫盲
2012-10-26 17:40 3874转自:http://www.cppblog.com/kevin ... -
reactor和proactor模式的比较
2012-10-26 17:38 1676转自:http://blog.163.com/zongyuan ...
相关推荐
在描述中提到的“基于SpringBoot的冬奥会科普平台系统”是一个典型的Web应用案例,主要目标是为公众提供关于冬季奥运会的知识普及和信息交流。这个平台可能包括以下几个关键模块: 1. 用户管理:用户注册、登录、...
它允许用户实时监控WebSocket连接,捕获和解析数据包,同时提供修改和重放功能,对于测试WebSocket应用的开发和调试非常有帮助。 3. IE HTTP Analyzer:这款工具专注于Internet Explorer浏览器的HTTP流量捕获,提供...
此外,SpringBoot还支持自动配置Spring模块和其他第三方库,如数据访问、安全、WebSocket等。 在这个项目中,我们可以看到以下几个关键的技术点: 1. **MVC架构**:SpringBoot提供了基于注解的MVC框架,使得控制器...
【标题】"基于SpringBoot的冬奥会科普平台"项目是一个综合性的技术实现,旨在利用现代Web技术和Java后端框架SpringBoot来构建一个普及冬季奥林匹克运动会知识的在线平台。这个平台不仅展示了SpringBoot的强大功能,...
微信小程序作为一种新型的移动应用形式,以其便捷性和普及性,在本系统中扮演了客户端的角色,而Websocket技术则用于建立服务器与客户端之间的实时双向通信。同时,Java语言用于开发服务端,确保了系统的稳定性和...
这些量表需要经过专业人员的校准和验证,确保其科学性和准确性。同时,小程序还需要具备数据分析能力,对用户的测试结果进行统计分析,提供个性化的反馈和建议。 在线咨询功能则需要考虑实时性与稳定性。可以利用...
- **开发环境与技术**:使用JDK 1.8、Tomcat服务器、SpringBoot、MyBatis作为后端框架,Netty用于部分功能实现,以及WebSocket保持与客户端的实时通讯。客户端开发使用Android Studio 3.5,接口测试工具为Postman,...
除此之外,项目还可能涉及其他技术,如集成第三方API(如地图API用于定位图书馆位置)、使用WebSocket实现实时通信(如图书状态更新通知)、部署与运维技术(如Docker容器化、Kubernetes集群管理)等。 整个智慧...
3. **社区活动**:增强邻里之间的交流,普及科普知识,活跃社区文化氛围。 4. **节省成本**:相比于传统的实物抢答器,软件系统降低了硬件投入,且易于维护更新。 综上,《多媒体知识竞赛抢答系统》以其强大的功能...
2.5 知识库:包含心理健康相关的文章、资讯,为用户提供科普知识。 2.6 在线咨询:集成即时通讯功能,用户可以与专业心理咨询师进行线上交流。 三、关键技术实现 3.1 Spring Security:提供用户认证和授权,确保...
"img"目录通常存放图片资源,这些图片可能是用于背景、图标或是科普教育内容的插图。HTML5的`<picture>`元素和`srcset`属性支持响应式图像,可以根据设备的分辨率和屏幕尺寸提供不同大小的图像,优化加载速度和用户...
5. SpringBoot:了解其核心概念,如SpringMVC、AOP、WebSocket等,并学会配置微服务和集成测试。 6. 数据库:可能涉及到MySQL或其他关系型数据库,学习SQL查询语言,理解数据库设计和优化。 7. 微信小程序:学习...
人机交互(Human-Computer Interaction, 简称HCI)是一项综合性的学科,涉及计算机科学、心理学、设计学以及工程等多个领域。在这个“人机交互项目”中,我们重点探讨如何利用JavaScript技术来提升用户体验,创造...
总之,大数据可视化理论及技术是数据科学的重要组成部分,它结合了计算机科学、信息设计和统计学的原理,旨在通过视觉手段提升大数据的理解和决策效率。随着技术的发展,大数据可视化将持续演进,为各行业带来更直观...
随着互联网的普及,人们对于在线沟通的需求日益增加,网络聊天室作为社交平台的重要组成部分,为用户提供了一个实时交流的平台。Python作为一门动态且强大的编程语言,具备良好的网络编程支持,如Socket编程库,使得...
7. 数学计算模块:提供数学运算和算法支持,例如矩阵运算、随机数生成、几何图形计算等,适用于科学计算或游戏开发等领域。 通过这些模块,初学者可以避免从零开始编写基础功能,而专注于解决具体问题,从而加速...
在当前的数字化时代,大数据已经成为了企业决策、科学研究和日常生活中不可或缺的一部分。为了更好地展示、分析和理解这些海量数据,一套高效且直观的用户界面至关重要。"8套大数据界面html工程 开箱即用!" 提供了...
掌上移动设备程序设计是计算机科学的一个重要领域,特别是在当今智能手机和平板电脑普及的时代。PocketBuilder是一款强大的跨平台开发工具,允许开发者创建针对多种移动设备的应用程序,包括早期的Palm OS设备以及...
通常,Python库会专注于特定领域,如数据处理、网络编程、科学计算、Web开发等。`pewlib`可能包含一系列的函数和类,帮助开发者处理常见的问题或提供独特的功能。 Python的Wheel文件是一种二进制分发格式,它允许...