我正在尝试让套接字与Chrome 16一起使用,它正在使用最新的协议: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17
服务器正在使用node.js并且代码是:
var http = require('http'), net = require('net'), crypto = require('crypto');
var server = http.createServer(function (req, res) {
console.log(req);
});
server.on('connection', function (stream) {
stream.setEncoding('utf8');
stream.setTimeout(0);
stream.setNoDelay(true);
stream.on('data', function (data) {
console.log(data);
console.log("****Incoming****\r\n" + data);
var securyPattern = /Sec-WebSocket-Key: (.*)/g;
var key = securyPattern.exec(data);
var magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
var sha1 = crypto.createHash('sha1');
sha1.update(key[1] + magic);
var accept = sha1.digest('base64');
var response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + accept;
stream.write(response);
console.log("****Outgoing****\r\n" + response);
});
});
server.listen(1337, 'xxxxxxx.no-ip.info');
no-ip.info是我的IP,我正在使用该地址为我的网络服务器工作正常。
head-tag里面的浏览器(客户端)代码:
window.onload = function () {
var myWebSocket = new WebSocket("ws://xxxxxxx.no-ip.info:1337/");
myWebSocket.onopen = function(evt) {
alert("open");
console.log("WebSockets connection opened");
myWebSocket.send("a test message");
};
myWebSocket.onmessage = function(evt) {
console.log("Got WebSockets message: " + e.data);
};
myWebSocket.onclose = function(evt) {
console.log("WebSockets connection closed");
};
};
onopen函数永远不会被触发,我在stackoverflow上找到了大部分代码,但是改了所以它可以使用最新协议,有没有人知道代码有什么问题? (当我连接它时,确实会在CMD中打印发送给它的数据,但在Chrome控制台中它只是说关闭连接(从不打开)。
答案 0 :(得分:4)
我不知道node.js,所以它可能会为你做这个但是......
您的回复不应以\ r \ n \ r \ n结尾吗?至少看起来你的接受标题缺少\ r \ n ...
答案 1 :(得分:0)
我怀疑您的回复缺少Web-Socket-Protocol标头。如果客户端发送协议列表(1个或更多),则服务器必须选择一个并在响应中返回它。
此外,您的回复应以“\ r \ n \ r \ n”结尾。
答案 2 :(得分:0)