WebSocket版本13的实现(Draft17)
网上找了WebSocket几个版本的实现有C#的,Netty的,NodeJS的实现,但都是旧版本(Draft76)的实现,在更新到最新版本的Chrome(16 stable)之后,就无法连接了。
于是在网上找了一些资料和代码拼凑成了最新版本协议的实现。
新版本WebSocket的安全验证方式发生了变化,原来有两个Web-Security-Key现在只有一个了,算法也变了。
原来是从Key1和Key2里面提取数字,空格,字符等,进行MD5运算。
现在变为一个Key字符串,与"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"进行sha-1运算,返回运算结果的base64编码。
数据传输方面也发生了变化,不再是旧版那种简单的明文帧,而是按帧(Packet)封装,带有长度、掩码等字段后再发送。注意这只是协议封装,并没有加密,内容仍然是明文;需要保密时仍应使用 wss/TLS。
参考资料:http://blog.csdn.net/les5332295/article/details/7014799
http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17
用旧版本的WebSocket+Socket.io中的WebSocket部分拼凑的版本13(Draft17)实现:
代码里同时保留了对旧版本 WebSocket 协议的兼容处理(是否可用取决于客户端和实现)。
示例:
var sys = require('util'),
ws = require('./ws.js')
var sockets = [];
var server = ws.createServer(function (socket) {
socket.addListener("connect", function (resource) {
console.log("client connected from " + resource);
sockets.push(socket);
//socket.write("welcome\r\n")
})
socket.addListener("data", function (data) {
console.log(data);
for(var i=sockets.length-1;i>-1;i--){
sockets[i].write(data)
}
})
socket.addListener("close", function () {
console.log("client left")
})
})
server.listen(8082)
浙公网安备 33010602011771号