WebSocket是一种协议

WebSocket,并非HTML 5独有,WebSocket是一种协议。只是在handshake的时候,发送的链接信息头和HTTP相似。HTML 5只是实现了WebSocket的客户端。其实,难点在于服务端,服务端相对还是比较复杂的。

网上demo很多,但是能讲到点上的不多,而且也不知道作者有没有深入试验过。WebSokect协议 ,handshake这part其实还是比较简单的,比较复杂的还是数据传输(第二部分)比较难。

上图是帧格式,对于解释可以看文档也可以查看文章:http://www.cnblogs.com/imayi/archive/2012/05/05/2485343.html

也就说,你需要解读opcode, Payload len 这些比较敏感的位值之后,你才开始取后面的Payload Data, 比如opcode如果是1,那么就是读取字符串,如果是2,那么就是读取流。

如果自己用java做服务端,握手协议的响应,换行符不能使“\r\n”或“\n”,因为这不是标准的换行符,其实是个字符串,只是屏幕显示的时候是换行,可以用PrintWrite.println(),或者

String newLine = (String) java.security.AccessController.doPrivileged(

new sun.security.action.GetPropertyAction("line.separator"));

握手之后,根据opcode做相应的操作,JAVA的IO和NIO,在实现方面都缺憾,难以实现。使用IO的话,在获得socket之 后,InputStream会处于阻塞,因为阻塞,所以后续做outputStream的操作时就会不方便。NIO的话,是SocketChannel写 入读出,基本都是ByteBuffer,用这个的话,有时opcode值为1(读取字符串),ByteBuffer解码得到的字符串经常性是乱码。感觉最 好还是学Tomcat,自己重写一下InputStream。

Tomcat在7.0.27之后就开始支持WebSocket,在它之上建立WebSocket是很简单的,基本就是继承 WebSocketServlet,实现createWebSocketInbound方法和重写StreamInbound的方法。Tomcat的 example里面有相关的例子。

Tomcat处理流程,WebSocketServlet本身就继承了HttpServlet,重写doGet方法,在doGet方法里面做了 handshake的操作,之后就是一些UpgradeInbound的操作,做好接收数据流的准备(StreamInbound提供了onData方 法)。每次数据过来,都会执行onData里面的WsFrame frame = wsIs.nextFrame(true); 对数据帧进行分析,并且提供自定义InputStream流,调用用户重写的onBinaryData或者onTextData方法,将输入流里面的数据 读出,再response给客户端。

WebSocketServlet(doGet) -> handshake ->  createWebSocketInbound  ->  doUpgrade  -> setUpgradeProcessor ->

onUpgradeComplete  -> onData -> 数据过来 -> wsIs.nextFrame(true)  ->  生成自定义InputStream -> 调用用户重写方法  (另外如果opcode是关闭Socket,也会有相应的操作)

http://www.open-open.com/lib/view/open1344582940452.html

时间: 2024-12-22 11:21:37

WebSocket是一种协议的相关文章

springboot集成websocket的两种实现方式

WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一.websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能发送信息.http链接分为短链接,长链接,短链接是每次请求都要三次握手才能发送自己的信息.即每一个request对应一个response.长链接是在一定的期限内保持链接.保持TCP连接不断开.客户端与服务器通信,必须要有客户端发起然后服务器返回结果.客户端是主动的,服务器是被动的. WebSocke

activeMQ支持的四种协议简介及性能比较

activeMQ5.11.1版本带的例子提供了四种协议的简单demo,这四种协议分别为:AMQP,MQTT,OpenWire,Stomp,通过运行这四种协议的的demo可以大致得出这四种协议实现在activeMQ中的性能对比: amqp Received 10001 in 6.58 seconds mqtt Received 10000 in 2.69 seconds openwire Received 10001 in 8.87 seconds stomp Received 10001 in 

java中TCP和UDP两种协议的区别?

协议(网络中计算机之间通信的规则) 马克-to-win:(视频下载) (全部书籍)协议就是生活中的合同,生活中我们比如做一个大的软件项目,我们得和人签合同,说你们第一步给一部分钱,我们第二步干完活,你们第三 步给剩余的钱.网络协议也一样,说明一步一步我们怎么通信.我们上网经常用到超文本传输协议 (HTTP)或文件传输协议 (FTP)或简单邮件传输协议 (SMTP),这章我们重点讲述传输控制协议(TCP)和用户数据报协议(UDP). "传输控制协议"(TCP),具有高度的可靠性.即收到的

dubbo 支持的9种协议

转: dubbo 支持的9种协议 文章目录 一.9种协议        1.dubbo 协议 (默认)        2.rmi 协议        3.hessian 协议        4.http 协议        5.webservice 协议        6.thrift 协议        7.memcached 协议        8.redis 协议        9.rest ( 就是 RestFull)    二.多协议配置        不同服务使用不同协议      

Python实现网络通信的几种协议

随着互联网的日益进步,很多人开始学习编程语言,今天我们来看一下网络通信的几种协议: 1)TCP/IP参考模型 主机到网络层:给网络互联层提供一个访问接口,以便在其上传递IP分组. 网络互联层:TCP/IP协议栈的核心,功能使把分组发送目标网络或主机. 传输层:使源端主机和目标端主机上的对等实体可以进行会话.传输层包括 TCP协议和UDP用户数据报协议. 应用层:应用层面向不同的网络应用不同的应用层协议,其中有基于TCP协议的,如FTP.Telnet.HTTP协议. 2)TCP连接 TCP是主机对

http与websocket两种协议下的跨域基于ASP.NET MVC--竹子整理

这段时间,项目涉及到移动端,这就不可避免的涉及到了跨域的问题.这是本人第一次接触跨域,有些地方的配置是有点麻烦,导致一开始的不顺. 至于websocket具体是什么意义,用途如何:请百度. 简单说就是建立一个基于互联网的实时通信. 在这里整理下这些内容,方便日后回顾. 一:介绍了WebSocket下的基于SignalR的跨域与不跨域例子 二:简单介绍了Http下的跨域问题 Ⅰ.WebSocket下的跨域 如果使用原生的方法来开发WebSocket应用,还是比较复杂的,不过好在Asp.net给我们

WebSocket实践——Java实现WebSocket的两种方式

什么是 WebSocket? 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. 我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据:这种客户端是主动方,服务端是被动方的传统Web模式

数据链路层的几种协议

计算机网络在现在生活中越来越重要,所以我们学习网络知识也就非常必要.网络通信分为学习研究的方便分为5层,即:物理层.数据链路层.网络层.传输层.应用层. 在数据链路层主要是负责传输数据,有很多种协议,用的最多的是局域网中的以太网协议,和广域网中的PPP协议,HDLC协议. Etherne II报头8    目标地址6    源地址6    以太类型2    有效负载46-1500    帧检验序列4 报头:8个字节,前7个0,1交替的字节(10101010)用来同步接收站,一个101010101

Http与Android网络请求的几种协议

HTTP深入浅出 http请求 HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.