`

WebSocket 学习概要

 
阅读更多

一、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是服务端的地址,监听的端口号为8787im是对应的请求名称,其中传送的参数为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/

  • 大小: 5.7 KB
分享到:
评论

相关推荐

    Spring Boot 集成 WebSocket(原生注解与Spring封装方式)

    内容概要:帮助读者通过 Spring Boot 框架一步步完成 WebSocket 集成,快速上手WebSocket。在通过两种方式集成的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期...

    Web开发:WebSocket连接建立过程及高级应用详解

    通过学习本文,读者可以掌握WebSocket的工作原理,实现高效的实时通信解决方案。 其他说明:本文不仅介绍了理论知识,还通过具体的代码示例演示了WebSocket的实际应用,方便读者在实践中理解和应用这些概念和技术。

    基于Spring Boot框架的车载传感器管理系统.zip

    希望学习Spring Boot和WebSocket技术的开发者 使用场景及目标 实时数据展示通过WebSocket技术,前端页面实时展示车辆的位置和温度数据。 历史数据查询提供历史数据列表查询功能,方便用户查看历史记录。 数据...

    基于Netty框架的MiniWeChat即时通讯系统.zip

    希望学习WebSocket协议应用的开发者 使用场景及目标 使用场景 社交应用用户可以通过MiniWeChat进行实时聊天、添加好友、管理好友列表等。 企业内部通讯支持企业内部员工之间的即时通讯,提高沟通效率。 目标...

    使用 PyQt5 编写的 TCP客户端程序

    内容概要: TCP客户端连接程序是一个使用PyQt5编写的简单网络应用程序。它旨在通过TCP协议连接到指定的服务器,并能够向服务器发送数据并接收来自服务器的数据。该程序提供了一个用户友好的图形用户界面,允许用户...

    14天学会安卓开发

    - 学习Android网络与通信技术,包括HTTP请求处理、WebSocket等。 - 掌握Android图形技术,包括画布(Canvas)、位图操作等。 - 学习Android动画技术,实现流畅的用户界面动画效果。 - 学习Android多媒体开发,...

    基于Netty框架的网络通信示例.zip

    内容概要 本项目是一个基于Netty框架的网络通信示例,涵盖了多种网络通信场景,包括TCP、UDP、WebSocket等。项目展示了如何使用Netty进行高性能的异步网络编程,并提供了丰富的示例代码和测试用例。 适用人群 有...

    硕士一年级软件工程课程设计:从0到项目实践

    内容概要:本文介绍了作者硕士一年期间所做的几门课程的设计,涉及了文本与图像数据分析、校园招聘信息分析、用户成长历史追踪、智能小车监控系统等多个项目。通过利用本科项目的原型,完成了从零开始的项目设计和...

    传智播客黎活明主讲3G手机Android应用开发8天课程

    #### 三、课程内容概要 根据描述中的信息,我们可以推测该课程将覆盖以下核心知识点: 1. **Android开发环境搭建** - 安装JDK(Java Development Kit) - 配置Android Studio - 创建第一个Android项目 2. **...

    网络聊天室系统设计与实现.doc

    在“网络聊天室系统设计与实现”这个文档中,我们探讨的是一个典型的软件工程实践项目,...通过这样的实践,学生不仅可以提升编程技能,还能学习到如何在实际环境中应用软件工程原理,为未来的职业生涯打下坚实的基础。

    python入门到高级全栈工程师培训 第3期 附课件代码

    python入门到高级全栈工程师培训视频学习资料;本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和...

    疯狂android讲义(7-12)

    以上是对《疯狂Android讲义》7-12章节的概要解析,每一章都是Android开发中的重要知识点,对于想要深入理解并掌握Android开发的开发者来说,这些都是必不可少的基础。通过学习这些内容,开发者可以具备开发复杂...

    计算机毕业设全套!计算机毕业设全套!

    8. **部署与运维**:了解Linux操作系统,学习使用Docker容器化技术进行部署,掌握Nginx、Apache等服务器配置,以及监控和日志管理。 9. **文档编写**:完整的设计文档、用户手册、开发者指南等是毕业设计的重要组成...

    高级项目经理

    - **WebSocket**:WebSocket协议提供了一个双向通信通道,使得客户端和服务器之间可以实时地交换数据,适用于聊天应用、实时数据传输等场景。 - **WebWorker**:WebWorker允许浏览器后台线程执行脚本,避免阻塞用户...

    spring framework 4.1.1 最新文档

    这包括改进的入门体验、移除已过时的包和方法、支持Java 8(以及6和7)、Java EE 6和7、Groovy Bean定义DSL、核心容器改进、通用Web改进、WebSocket、SockJS和STOMP消息传递以及测试改进。 III. 核心技术:在文档的...

    智能抢课系统——适用于湾大正方教务管理系统的抢课系统。

    适用人群:大学生 自学者 使用场景:大学生毕设 自学者练手项目 学习与交流 其它说明:部分资源来源网络及开源社区、仅供参考与学习、不可商用、...内容概要:智能抢课系统——适用于湾大正方教务管理系统的抢课系统。

    张杰_java工程师1

    在【教育背景】部分,张杰毕业于成都大学,获得了软件工程学位,并在学习期间积累了丰富的项目经验。他曾在四川鱼鳞图信息技术有限公司股份任职,期间参与了接入上报系统和土地确权系统的开发。 在【工作经验】上,...

    NodeNotes:MyNodeNotes --------------------------- TheOrientBoyOfGod

    《Node.js学习笔记——...以上是TheOrientBoyOfGod关于Node.js的个人笔记概要,内容涵盖从基础到进阶,适合初学者和有一定经验的开发者参考学习。通过这些知识的学习,读者可以更好地理解和运用Node.js进行后端开发。

    BlazeDS开发者指南.pdf

    **BlazeDS概要** BlazeDS是一个服务器端的中间件,它允许Flex和AJAX客户端与Java应用程序服务器进行双向通信。它的核心功能包括远程过程调用(RPC)服务和基于AMF(Action Message Format)的消息服务。AMF是一种...

Global site tag (gtag.js) - Google Analytics