在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] = 0x00
byte[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)
第一次写技术性的文章。希望大家喜欢,多多指教 ^_^.
分享到:
相关推荐
WebSocket是一种在客户端和服务器之间建立长连接的协议,它允许双方进行全双工通信,即数据可以在任意方向上...开发者可以通过这个项目深入理解WebSocket的工作原理,以及如何在Spring环境中构建高效、实时的聊天应用。
总结来说,这个WebSocket聊天室项目是一个结合了WebSocket、PHP、HTML5和JavaScript技术的实时通讯应用。它演示了如何使用WebSocket实现双向通信,以及如何在PHP环境下构建一个聊天服务器。通过解压并按照`README.md...
在本文中,我们将深入探讨WebSocket的基本概念、工作原理以及如何使用Java实现一个简单的WebSocket聊天室。 WebSocket协议是在HTTP的基础上发展起来的,旨在解决HTTP协议下实时通信效率低下的问题。传统的HTTP协议...
学习和理解这个WebSocket通讯范例,可以帮助开发者掌握WebSocket的基本用法,从而在实时聊天应用、在线游戏、股票交易系统等需要实时数据交互的场景中应用WebSocket技术。通过分析和调试示例代码,你可以深入理解...
在HTML5中,`WebSocket`对象允许我们创建到WebSocket服务器的连接。创建连接后,我们可以调用`send`方法发送数据,并注册`onmessage`事件处理器来接收服务器发送的数据。JavaScript的WebSocket API使用起来非常直观...
描述中的"websocket服务端程序,实现与html5通讯"进一步确认了这个程序的用途,即它不仅包含客户端部分,还有服务端部分,能够与使用HTML5的Web客户端进行通信。HTML5是WebSocket协议的主要推动者,因为它引入了...
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在两个方向上...这个示例对于理解WebSocket工作原理、进行实时通信应用开发,以及熟悉.NET和Web开发技术都非常有帮助。
总的来说,这个"HTML5+WebSocket+PHP框架聊天室"项目是一个很好的学习和实践实时通信技术的平台,它可以帮助开发者理解WebSocket的工作原理,并将其应用于游戏、实时协作工具或其他需要实时交互的应用中。
在这个“H5实现WebSocket聊天对话”的项目中,我们将深入探讨WebSocket的基本原理、如何在前端使用WebSocket进行聊天功能的开发,以及可能遇到的问题和解决方案。 1. WebSocket基础知识: WebSocket是一种在客户端...
《Spring整合WebSocket实现实时通讯详解》 WebSocket协议的出现,为Web应用提供了全双工、低延迟的通信方式,使得服务器能够主动向客户端推送数据,极大地丰富了Web应用的交互体验。Spring框架作为Java领域中极为...
以上就是对"Android-H5即时通讯源码"的解析,涵盖了从即时通讯原理到Android开发,再到HTML5技术和跨平台交互等多个关键知识点。开发者可以通过研究这个源码,学习如何构建自己的即时通讯应用。
HTML5和PHP结合WebSocket技术可以实现高效的实时聊天应用。...通过理解WebSocket协议的工作原理,学习使用PHP的WebSocket库,以及掌握HTML5 WebSocket API,开发者可以构建出稳定且高效的实时聊天系统。
WebSocket 协议是 HTML5 的一部分,旨在替代传统的 HTTP 请求方式,提供全双工、低延迟的通信环境,特别适合实时性要求高的应用场景,如在线游戏、股票交易、聊天室、远程控制等。 WebSocket 的工作原理与 HTTP ...
WebSocket协议是HTML5标准的一部分,它的出现解决了传统的HTTP协议在进行长连接时的效率问题。HTTP协议是基于请求-响应模式的,每次通信都需要客户端发起请求,服务器响应,这在实时性要求高的场景下显得效率低下。...
首先,我们需要理解Websocket的基本工作原理。Websocket通过建立一个持久化的TCP连接,一旦连接建立成功,双方就可以自由地发送数据。在客户端,我们通常使用`WebSocket`对象来创建和管理这个连接,并定义消息的发送...
WebSocket通讯协议是互联网上一种用于实现双向通信的协议,它为客户端和服务器之间提供长久连接,使得数据可以高效地在两者之间实时交换。WebSocket协议在HTML5中被引入,极大地改进了Web应用对于实时性需求的支持。...
总的来说,这个项目提供了一个实际操作WebSocket和Java即时通讯的示例,对于学习和理解WebSocket的工作原理以及如何在Java环境中实现是非常有价值的。通过研究和运行这个项目,你不仅可以掌握WebSocket的基本用法,...
在IT行业中,实时通信已经成为许多应用程序的核心需求,无论是在线聊天、游戏、股票交易还是协作工具。...开发者只需要理解WebSocket的基本原理,熟悉Django框架,就可以开始创建自己的实时Web应用。