我正在尝试在 nodejs 中编写一个非常简单的 websocket 服务器,但遇到了一个问题。在浏览器上,WebSocket.onclose 函数是唯一被触发的函数(onopen、onmessage 和 onerror 不会)。我已经在Chrome7和FireFox4中进行了测试。这是我的服务器代码:
var http = require('http'),
净=要求('净'),
加密 = require('加密');
var server = http.createServer(function (req, res) {
控制台.log(请求);
});
server.on('连接', 函数 (流) {
Stream.setEncoding('utf8');
流.setTimeout(0);
流.setNoDelay(true);
Stream.on('数据', 函数 (数据) {
var sec1_regex = /Sec-WebSocket-Key1:(.*)/g;
var sec2_regex = /Sec-WebSocket-Key2:(.*)/g;
var origin_regex = /原点: (.*)/g;
var protocol_regex = /Sec-WebSocket-协议: (.*)/g;
控制台.log(流);
console.log("****传入****\r\n" + data);
var key1 = sec1_regex.exec(data)[1];
var num1 = parseInt(key1.match(/\d/g).join(''))/(key1.match(/\s/g).length - 1);
console.log("num1: " + num1);
var key2 = sec2_regex.exec(data)[1];
var num2 = parseInt(key2.match(/\d/g).join(''))/(key2.match(/\s/g).length - 1);
console.log("num2: " + num2);
var Lastbytes = data.slice(-8);
var origin = origin_regex.exec(data)[1];
var md5 = crypto.createHash('md5');
md5.update(String.fromCharCode(num1 >> 24 & 0xFF, num1 >> 16 & 0xFF, num1 >> 8 & 0xFF, num1 & 0xFF));
md5.update(String.fromCharCode(num2 >> 24 & 0xFF, num2 >> 16 & 0xFF, num2 >> 8 & 0xFF, num2 & 0xFF));
md5.update(lastbytes);
var response = "HTTP/1.1 101 WebSocket 协议握手\r\n升级:WebSocket\r\n连接:升级\r\nSec-WebSocket-Origin: "
+ 原点 + "\r\nSec-WebSocket-Location: ws://127.0.0.1:8124/\r\n" +
md5.digest('二进制');
流.write(响应, '二进制');
console.log("****传出****\r\n" + 响应);
});
});
服务器.listen(8124, '127.0.0.1');
我的客户代码:
函数连接(){
if (window.WebSocket) {
尝试 {
ws = new WebSocket('ws://127.0.0.1:8124');
ws.onopen = 函数 () {
警报(“打开”);
};
ws.onclose = 函数() {
警报(“关闭”);
};
ws.onerror = 函数(错误){
警报(“错误!”);
};
ws.onmessage = 函数() {
警报('消息');
};
} 抓住(前){
警报(前);
}
}
}
好吧,这里有一些问题,之所以只onclose触发句柄是因为浏览器没有收到有效的握手,因此终止了连接。
您始终ws://127.0.0.1:8124/作为位置发送,该位置应该与浏览器在请求中发送的任何内容完全匹配,在这种情况下很可能如此localhost:8124,因此您应该ws://localhost:8124/在这种情况下返回。
您在响应标头之后缺少另一个\r\n标头,因此实际上您没有发送任何正文。
您计算的哈希值似乎有问题,我仍在尝试找出原因
对于一个有效的(而且相当小的)实现,请参见这里: http:
//github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/ws.js
| 归档时间: |
|
| 查看次数: |
5869 次 |
| 最近记录: |