`
- 浏览:
1264354 次
-
HTML5 WebSocket 通讯原理(Java实现)
在javaeye都好久了.但是从来没发表个什么东西由于最近在观注 HTML5 于是就看了下WebSocket又不想找现成的框架去搞.就打算自己弄弄.开始吧.提前条件1> 了解socket.2> 了解协议,了解HTTP协议更好.(想想为什么需要协议就行.安全?保证数据完整?便于解析?)3> 理解字节,字节序,如: 32位int 的 30转成 高字节序的字节 及是 0x00 0x00 0x00 0x1E,低字节序则 0x1E 0x00 0x00 0x00. 没数错的话是4个字节^_^Web Socket参考文章 1. http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 因为感觉里面有点乱,顺序没有按常理出牌. 下面是按我觉得应该有的顺序截取了该文章关键部分 The following diagrams summarise the protocol: Handshake | V Frame type byte <-------------------------------------. | | | | `-- (0x00 to 0x7F) --> Data... --> 0xFF -->-+ | | `-- (0x80 to 0xFF) --> Length --> Data... ------->-' 一个 WebSocket 通讯流程 简单说.就是先握手.在谈话.(跟见到领导一样)Internet-Draft The WebSocket protocol August 2010/*请求部分也就是浏览器传到服务器的数据,需要解析*/ 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 ^n:ds[4U The handshake from the server looks as follows: /*响应部分 需要根据 请求消息 来生成响应报文*/ 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 8jKS'y:G*Co,Wxa- //上面request/response部分的以第二行至倒数第三行 都是这种格式,并且顺序无关 After the leading line in both cases come an unordered ASCII case- insensitive set of fields, one per line, that each match the following non-normative ABNF: [RFC5234] field = 1*name-char colon [ space ] *any-char cr lf colon = %x003A ; U+003A COLON (:) space = %x0020 ; U+0020 SPACE cr = %x000D ; U+000D CARRIAGE RETURN (CR) lf = %x000A ; U+000A LINE FEED (LF) name-char = %x0000-0009 / %x000B-000C / %x000E-0039 / %x003B-10FFFF ; a Unicode character other than U+000A LINE FEED (LF), U+000D CARRIAGE RETURN (CR), or U+003A COLON (:) any-char = %x0000-0009 / %x000B-000C / %x000E-10FFFF ; a Unicode character other than U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) NOTE: The character set for the above ABNF is Unicode. The fields themselves are encoded as UTF-8. Lines that don't match the above production cause the connection to be aborted. /****************重点部分******************/ To prove that the handshake was received, the server has to take three pieces of information and combine them to form a response. The first two pieces of information come from the |Sec-WebSocket-Key1| and |Sec-WebSocket-Key2| fields in the client handshake: Sec-WebSocket-Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8 Sec-WebSocket-Key2: 1_ tx7X d < nw 334J702) 7]o}` 0 For each of these fields, the server has to take the digits from the value to obtain a number (in this case 1868545188 and 1733470270 respectively), then divide that number by the number of spaces characters in the value (in this case 12 and 10) to obtain a 32-bit number (155712099 and 173347027). These two resulting numbers are then used in the server handshake, as described below. with 0x0D 0x0A and followed by 8 random bytes, part of a challenge, and the server sends 18 bytes starting with 0x0D 0x0A and followed by 16 bytes consisting of a challenge response. The details of this challenge and other parts of the handshake are described in the next section. The concatenation of the number obtained from processing the |Sec- WebSocket-Key1| field, expressed as a big-endian 32 bit number, the number obtained from processing the |Sec-WebSocket-Key2| field, again expressed as a big-endian 32 bit number, and finally the eight bytes at the end of the handshake, form a 128 bit string whose MD5 sum is then used by the server to prove that it read the handshake. 大概意思就是说 服务端需要根据 Sec-WebSocket-Key1,Sec-WebSocket-Key2和请求响应部分的最后8个字节 生成一个16个字节的数组(128位) 再对他进行MD5 签名也就是响应消息最后的 8jKS'y:G*Co,Wxa-实际上是根据 Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 ^n:ds[4U //请求响应部分的最后8个字节 计算出来的规则:将的key1值部分"4 @1 46546xW%0l 1 5" 取掉非数字的字符,会得到一个数字 则: 414654015 在计算该字符串的空格数 假设为 n 让 int key1 = (414654015 / n); 然后将他转成 高字节序的字节数组 伪代码:public byte[] formatKey(String key);main{byte[] bytes = new byte[16];bytes[0~3] = formatKey(key1);bytes[4~7] = formatKey(key2);bytes[8~15] = 请求响应部分的最后8个字节bytes = md5(bytes);} /***********************************************/ 接下来的就简单了===发消息 This wire format for the data transfer part is described by the following non-normative ABNF, which is given in two alternative forms: the first describing the wire format as allowed by this specification, and the second describing how an arbitrary bytestream would be parsed. [RFC5234] //大概意思就是说有两种数据通讯协议,第一种简单的文本,也就是源码里用的,第二种就是二进制数据通讯协议.. ****传输之前必须先握手**** ; the wire protocol as allowed by this specification frames = *frame frame = text-frame text-frame = (%x00) *( UTF8-char ) %xFF ; the wire protocol including error-handling and forward-compatible parsing rules frames = *frame frame = text-frame / binary-frame text-frame = (%x00-%x7F) *( UTF8-char / %x80-%x7E ) %xFF binary-frame = (%x80-%xFF) length < as many bytes as given by the length > length = *(%x80-%xFF) (%x00-%x7F) 遵循他的格式. 照着socket 收发消息那样发就OK了!如:发一个 Hello!byte[] data = new byte[2+];byte[0] = 0x00byte[1~data.length - 1] = "Hello!".getBytes("UTF-8");byte[data.length - 1] = 0xFF//源码运行方式1.WebServerSocket.main();2.打开 socket.html (用Google Chrome)我的环境: WindowsXP,JDK1.6 , Google Chrome(version 13.0.782.220 m)
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Java基于WebSocket实现的视频聊天是一种实时通信(Real-Time Communication, RTC)的应用,它利用了WebSocket这一先进的网络协议来实现高效、双向的数据传输。WebSocket协议是HTML5的一个重要特性,为客户端与服务器...
总的来说,这个项目提供了一个实际操作WebSocket和Java即时通讯的示例,对于学习和理解WebSocket的工作原理以及如何在Java环境中实现是非常有价值的。通过研究和运行这个项目,你不仅可以掌握WebSocket的基本用法,...
在“WebSocket通讯范例”中,`webSocketTest`可能是实现WebSocket通信的一个测试项目或者代码示例。这个示例可能包含以下关键部分: 1. **客户端代码**:客户端通常使用JavaScript来实现WebSocket连接,通过`new ...
在这个“H5实现WebSocket聊天对话”的项目中,我们将深入探讨WebSocket的基本原理、如何在前端使用WebSocket进行聊天功能的开发,以及可能遇到的问题和解决方案。 1. WebSocket基础知识: WebSocket是一种在客户端...
【描述】中提到的Java Websocket技术是现代Web应用程序中实现双向通信的关键技术,它允许服务器和客户端进行持续的、低延迟的数据交换,从而实现真正的实时通讯。在传统的HTTP协议中,服务器与客户端的通信基于请求-...
开发者可以借此学习到如何使用Java进行服务器端开发,理解WebSocket的工作原理,以及如何利用Ext来提升前端用户体验。对于想要深入学习Web开发特别是WebSocket技术的人来说,这是一个很好的实践案例。
总的来说,"h5聊天室(websocket实现)"是一个基于HTML5、WebSocket和UMEditor的实时通讯应用,通过Eclipse这样的IDE进行开发,旨在提供流畅的在线交流体验。WebSocket协议的使用确保了消息的即时传递,而UMEditor则...
通过阅读和理解代码,你可以了解WebSocket协议的工作方式,以及如何使用Java和HTML5实现一个基本的聊天应用。无论是对于开发即时通讯软件,还是构建其他需要实时交互功能的Web应用,WebSocket都是不可或缺的技术。
WebSocket通讯协议是互联网上一种用于实现双向通信的协议,它为客户端和服务器之间提供长久连接,使得数据可以高效地在两者之间实时交换。WebSocket协议在HTML5中被引入,极大地改进了Web应用对于实时性需求的支持。...
这个项目对于学习WebSocket和Netty的结合使用,以及理解实时通讯系统的架构和工作原理具有很高的参考价值。通过阅读和实践这个项目,开发者可以深入理解如何在Java后端利用Netty搭建WebSocket服务器,以及在前端如何...
服务器端通常用Node.js(搭配ws库)或者Java(使用Jetty或Tomcat的WebSocket API)等编程语言实现。 2. **客户端**:客户端通常是浏览器或移动应用,它们通过JavaScript API与WebSocket服务器建立连接。在HTML5中,...
描述中的"websocket服务端程序,实现与html5通讯"进一步确认了这个程序的用途,即它不仅包含客户端部分,还有服务端部分,能够与使用HTML5的Web客户端进行通信。HTML5是WebSocket协议的主要推动者,因为它引入了...
在"WebApplication6"这个文件夹中,可能包含的是一个简单的WebSocket应用实例,包括服务器端代码(可能是用Node.js或Java等后端语言编写)和客户端的HTML、JavaScript代码。你可以通过运行这个示例来了解WebSocket的...
在本项目中,WebSocket被用来实现客服和多个访客的即时通讯功能。客服可以同时与多个访客进行对话,这样的设计非常适合客服中心或者在线支持场景,使得客服能够高效地处理来自不同访客的问题。对于用户来说,可以...
本项目"基于Java语言开发IM即时通讯聊天系统源码.zip"提供了完整的源代码,帮助开发者深入理解IM系统的实现机制。以下是这个系统的核心知识点及详细解析: 1. **Java编程基础**:作为基础,开发者需要熟悉Java编程...
了解并掌握WebSocket的基本原理和API,以及如何在客户端和服务器端进行相应的编程,是构建此类应用的关键。同时,考虑安全性、性能优化和多用户同步等问题,可以使聊天应用更加健壮和用户体验更好。
你可以通过它了解WebSocket的基本工作原理,以及如何在前后端配合实现即时通讯功能。同时,这个聊天室还涉及到了用户交互设计、数据序列化和反序列化等多方面的知识,对于提升全栈开发能力十分有益。
《Spring整合WebSocket实现实时通讯详解》 WebSocket协议的出现,为Web应用提供了全双工、低延迟的通信方式,使得服务器能够主动向客户端推送数据,极大地丰富了Web应用的交互体验。Spring框架作为Java领域中极为...
在本文中,我们将深入探讨如何使用Spring Boot框架整合WebSocket技术,以实现即时...这个过程对于新手来说是一个很好的实践项目,可以帮助他们理解Spring Boot和WebSocket的结合使用,以及即时通讯的基本原理和实现。
WebSocket是Web应用中实现即时通讯(Real-Time Communication, RTC)的一种技术标准,它在HTML5中被引入,为建立持久的、低延迟的双向通信提供了可能。本项目“websocket2018”显然是一个利用WebSocket协议和后台...