网上找了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为单位封装后进行发送。
参考资料: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)