一、WebSocket协议
1、介绍
websocket是一种基于一个TCP连接的全双工的通讯方式,也就是说,服务端可以主动推数据到客户端,客户端也可以发送数据到服务端。
在webcoket中,是由客户端先发送请求头信息到服务端,服务端对请求进行检查,如果是合法的请求头,则会发送握手信息( handshake)到客户端。同是为每个客户端建产一个socket用来通信。这个socket有输入流,也有输出流,是一个全双工的tcp通信端口。
其中客户端的请求头和服务端的握手信息都是每行一个的键值对信息,且字符编码为ASCII 编码。这个很重要,因为在传送数据的时候,是以utf8做编码的。
Websocket 由两部分组成,一部分是浏览器中的WebSocket API(隶属于HTML5规范), 由W3C组织制订;一部分是WebSocket协议(可以用任何语言来实现), 由IETF组织制订。
2、流程
握手:建产握手。这个是整个websocket协议中最重要的一个环节。因为握手是建立连接,或进行下一步通信的关键,也是关系到你是否能和其它遵寻html5 websocket协议的浏览器(如chrome,fiirfox4.0等)进行通信的关键。
当握手成功后,就是进行数据传送了。注意 ,这个时候tcp连接已在经建立了,现在客户发送上来的时候就是纯纯的数据了。服务端要判断什么时候是一次数据请求的开始,什么时候是请求的结束。这个也要是处理在tcp发送中的黏包问题。由于在tcp协议中,会存在两个缓冲区去存放发送的数据或接收的数据,如果没有显的分割符则会让服务端无法正确的识别两条命令。(PS:如果定位数据过多,时间太短会不会造成黏包问题)。
每个端只要向另一端口发送一个0xFF的信息,就表示连接已结束了。这个相关于tcp/ip协议中的fin/ack。
处理websocket链接,服务端只会去识别ws://或wss://开头的请求,这样的话,就不会和其它的监听服务进行冲突出了吧。
注:客户端发送的请求中,服务端地址为wss://www.example.com:8787/im?id=123456
那么www.example.com是服务端的地址,监听的端口号为8787,im是对应的请求名称,其中传送的参数为id,值为123456.
3、API介绍
提供下面三个接口
onopen: 当接口打开时
onmessage: 当收到信息时
onclose: 当接口关闭时
上面的几个方法已在chrome浏览器中得到支持,开发接口也相对简单。
二、WebSocket前端开发
1、浏览器对WebSocket的支持
Google Chrome浏览器最先支持WebSocket,随后是Safari,Firefox,此外最新版本的Opera和IE(Opera11,IE10)也支持WebSocket。下面是主要浏览器的支持情况,Opera11中默认关闭了WebSocket支持,所以这里没有列出,更多信息可参考:http://en.wikipedia.org/wiki/WebSocket 与 http://caniuse.com/#search=websockets
2、客户端WebSocket的主要方法
浏览器支持程度各有区别,前面wiki中关于WebSocket的“Browser support”章节有介绍,遵循w3c关于WebSocket API的相关规范,浏览器提供了WebSocket类型,在Firefox中为MozWebSocket,检测浏览器是否支持WebSocket可以使用下面的脚本代码:
检测浏览器是否支持WebSocket
window.WebSocket = window.WebSocket || window.MozWebSocket; if (!window.WebSocket){ alert("WebSocket not supported by this browser"); return; }
构造函数 - WebSocket#constructor(url, optional protocols)
第一个参数是请求地址,第二个参数选填,表示协议名
使用示例:
var websocket = new WebSocket("ws://127.0.0.1:8080/alarm/alarmServer");
WebSocket事件 #onopen, onmessage, onclose, onerror
连接打开时,回调onopen方法,接收到后台消息时会触发到onmessage事件,后台关闭时调用onclose,出现连接异常时可在onerror中捕获
使用示例:
websocket.onmessage = function(evt){ var data = evt.data; }
方法 - send/close
发送消息 - WebSocket#send(data)
关闭连接 - WebSocket#close(optional code, optional reason)
使用示例:
websocket.send(JSON.stringify({action: "node.remove", id: "001"}));
三、WebSocket后端开发
WebSocket不同于http协议,传统的web服务器通常不支持WebSocket,比如tomcat目前就不支持(tomcat 7.0.26 支持WebSocket了),反倒是一些小众的或者更活跃的web server率先支持WebSocket,如jetty,以及基于node.js的WebSocket-Node扩展,基本上各种编程语言都有相应的服务器可以选择,下图是我列举的几种,详细情况参阅:
http://en.wikipedia.org/wiki/Comparison_of_WebSocket_implementations
1、jetty对WebSocket的实现
http://www.blogjava.net/TWaver/archive/2012/05/03/377244.html
WebSocketServlet基于servlet标准,增加了doWebSocketConnect(...)方法,为客户端请求创建一个后台对应的WebSocket实例。
org.eclipse.jetty.websocket.WebSocketServlet { WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) }
后台WebSocket类,与客户端WebSocket类对应,能监听open, message, close等状态变化事件,并包含一个Connection属性,用于向客户端发送消息。
WebSocket.Connection 后台连接类,包含于WebSocket对象中,用于向客户端推送消息
当然还有其他实现,比如jWebSocket、JBoss 7,以及Tomcat 7,等等
四、WebSocket Java实现
jWebSocket后面详叙。
五、WebSocket Demo
Mozilla开源社区
https://developer.mozilla.org/en-US/demos/search?q=websocket
六、资源链接
http://www.cnblogs.com/dtdnh520/archive/2010/11/09/1873095.html
http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76
http://www.cnblogs.com/dtdnh520/archive/2010/11/09/1873103.html
https://developer.mozilla.org/en-US/docs/WebSockets
http://jwebsocket.org/
相关推荐
内容概要:帮助读者通过 Spring Boot 框架一步步完成 WebSocket 集成,快速上手WebSocket。在通过两种方式集成的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期...
通过学习本文,读者可以掌握WebSocket的工作原理,实现高效的实时通信解决方案。 其他说明:本文不仅介绍了理论知识,还通过具体的代码示例演示了WebSocket的实际应用,方便读者在实践中理解和应用这些概念和技术。
内容概要:本文详细介绍了如何在Django框架中使用WebSocket和Django Channels实现高效的实时通信功能。主要内容包括:WebSocket的基本原理及其在现代Web应用中的重要性;Django Channels的架构和使用方法;具体实例...
希望学习Spring Boot和WebSocket技术的开发者 使用场景及目标 实时数据展示通过WebSocket技术,前端页面实时展示车辆的位置和温度数据。 历史数据查询提供历史数据列表查询功能,方便用户查看历史记录。 数据...
希望学习WebSocket协议应用的开发者 使用场景及目标 使用场景 社交应用用户可以通过MiniWeChat进行实时聊天、添加好友、管理好友列表等。 企业内部通讯支持企业内部员工之间的即时通讯,提高沟通效率。 目标...
内容概要: TCP客户端连接程序是一个使用PyQt5编写的简单网络应用程序。它旨在通过TCP协议连接到指定的服务器,并能够向服务器发送数据并接收来自服务器的数据。该程序提供了一个用户友好的图形用户界面,允许用户...
概要内容中提到了多个文件,这些文件的具体作用可能如下: 1. “新建 Microsoft Word 文档.doc”可能包含了上述介绍的详细内容,为开发者提供了一个学习的起点,让开发者能够从理论知识着手。 2. “1099925198.rar...
- 学习Android网络与通信技术,包括HTTP请求处理、WebSocket等。 - 掌握Android图形技术,包括画布(Canvas)、位图操作等。 - 学习Android动画技术,实现流畅的用户界面动画效果。 - 学习Android多媒体开发,...
内容概要 本项目是一个基于Netty框架的网络通信示例,涵盖了多种网络通信场景,包括TCP、UDP、WebSocket等。项目展示了如何使用Netty进行高性能的异步网络编程,并提供了丰富的示例代码和测试用例。 适用人群 有...
内容概要:本文介绍了作者硕士一年期间所做的几门课程的设计,涉及了文本与图像数据分析、校园招聘信息分析、用户成长历史追踪、智能小车监控系统等多个项目。通过利用本科项目的原型,完成了从零开始的项目设计和...
#### 三、课程内容概要 根据描述中的信息,我们可以推测该课程将覆盖以下核心知识点: 1. **Android开发环境搭建** - 安装JDK(Java Development Kit) - 配置Android Studio - 创建第一个Android项目 2. **...
在“网络聊天室系统设计与实现”这个文档中,我们探讨的是一个典型的软件工程实践项目,...通过这样的实践,学生不仅可以提升编程技能,还能学习到如何在实际环境中应用软件工程原理,为未来的职业生涯打下坚实的基础。
python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和...
以上是对《疯狂Android讲义》7-12章节的概要解析,每一章都是Android开发中的重要知识点,对于想要深入理解并掌握Android开发的开发者来说,这些都是必不可少的基础。通过学习这些内容,开发者可以具备开发复杂...
8. **部署与运维**:了解Linux操作系统,学习使用Docker容器化技术进行部署,掌握Nginx、Apache等服务器配置,以及监控和日志管理。 9. **文档编写**:完整的设计文档、用户手册、开发者指南等是毕业设计的重要组成...
- **WebSocket**:WebSocket协议提供了一个双向通信通道,使得客户端和服务器之间可以实时地交换数据,适用于聊天应用、实时数据传输等场景。 - **WebWorker**:WebWorker允许浏览器后台线程执行脚本,避免阻塞用户...
这包括改进的入门体验、移除已过时的包和方法、支持Java 8(以及6和7)、Java EE 6和7、Groovy Bean定义DSL、核心容器改进、通用Web改进、WebSocket、SockJS和STOMP消息传递以及测试改进。 III. 核心技术:在文档的...
适用人群:大学生 自学者 使用场景:大学生毕设 自学者练手项目 学习与交流 其它说明:部分资源来源网络及开源社区、仅供参考与学习、不可商用、...内容概要:智能抢课系统——适用于湾大正方教务管理系统的抢课系统。
【JSP论坛开发详解】 ...在这个课设中,学生们将通过JSP来构建一个在线论坛,这是一个实践性的...参考文献部分通常包含在项目开发过程中参考的技术文档、教程或其他相关资料,对于深入学习和理解项目的实现细节至关重要。
在【教育背景】部分,张杰毕业于成都大学,获得了软件工程学位,并在学习期间积累了丰富的项目经验。他曾在四川鱼鳞图信息技术有限公司股份任职,期间参与了接入上报系统和土地确权系统的开发。 在【工作经验】上,...