webSocket 服务器端的简单实现上周研究了一下HTML5.发现很多令人激动的功能。路漫漫其修远兮,吾将上下而求
webSocket 服务器端的简单实现
上周研究了一下HTML5.
发现很多令人激动的功能。
路漫漫其修远兮,吾将上下而求索!
1. 内置数据库
2. 支持WebSocket
3. 支持多线程
4. 支持本地存储
但是,仍然处于草案中的 WebSocket 竟然找不到合适的服务器,刚好工作比较闲,用来三天时间自己写了一个。
功能有点简单!设计上也有很大缺陷。只能简单的发送信息,和推送信息。
而且现在的协议还不成熟,不久就有一个版本出现!昨天看到才是V16,今天出V17了。
简单介绍一下 WebSocket 它是实现了浏览器与服务器的全双工信息传输。Websocket协议基于Http 的 Upgrade 头和101的响应进行协议切换。经过简单的握手协议,建立一个长连接,按照协议的规则进行数据的传输。具体介绍可以参考google.
1.握手协议
版本0--3中:
握手通过请求头Sec-WebSocket-Key1 和 Sec-WebSocket-Key2 的值和 8 字节的请求实体,进行MD5加密,将加密结果,构造出一个16字节作为请求实体的内容返回。如下实例:
------------------请求--------------------------------------------
@Overridepublic int read() throws IOException {if (readLength >= length)return -1;int b = 0;synchronized (lock) {if (readLength >= length)return -1;b = super.read();if (isMask) {b ^= maskKey[(int) (readLength % 4)];}readLength++;}return b;}
关于流的关闭:一般情况我们可以直接 使用socket.close() 进行关闭,客户端JS状态会显示 webSocket.readyState 的值为 2 (正在关闭的状态)。需要我们通过握手去要求远端关闭流。
有三个版本:
在版本 0 时:传两个字节 (0xff,0x00);
在版本 1--6 时:传三个字节 (0x80,0x01,0x00);
在版本 7--以上 时:传两个字节 (0x88,0x00);
经测试 只有 在版本 7--以上 时:传两个字节 (0x88,0x00); 这时可以实现 webSocket.readyState 的值为 3。
估计是我的代码有问题。如有发现请告知,谢谢!
websocket 协议: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10 (其他版本查看相关链接)
源码SVN地址:http://lineblog.googlecode.com/svn/trunk/ 下面的目录
httpAnalysis/src/com/googlecode/lineblog/websocket/
SVN地址移到:https://lineblog.googlecode.com/svn/trunk/
httpAnalysis/websokcet/com/googlecode/lineblog/websocket/
或者后面的地址下载源码
[完]
转载请保留原文地址: http://lchshu001.iteye.com/blog/1184428 , 谢谢 1 楼 max_dong_max_1 2011-10-02 老兄,你这是HTML5的功能是吧! 2 楼 lchshu001 2011-10-02 max_dong_max_1 写道老兄,你这是HTML5的功能是吧!
是啊 html5 的新功能,欢迎交流。 3 楼 pandong8183 2012-05-15 太有用了,万分感谢 4 楼 stwei1983 2012-06-14 好多谢,正在找这方面的资料,帮大忙了