【问题标题】:Chrome 16 websockets hybi-17Chrome 16 websockets hybi-17
【发布时间】:2011-12-30 16:40:00
【问题描述】:

我正在尝试让套接字与使用最新协议的 Chrome 16 一起工作: https://datatracker.ietf.org/doc/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 内 script-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 控制台中它只是说关闭连接(从不打开)。

【问题讨论】:

  • 如果为myWebSocket.onerror定义一个函数会得到什么?
  • 它也没有被触发:/

标签: html node.js websocket


【解决方案1】:

您是否尝试过查看 http://socket.io ?既有节点模块又有前端

【讨论】:

  • 看起来很有意思,但是我找不到下载链接,我现在用的是windows,怎么安装?
  • 你可以使用 NPM 节点包管理器吗? npmjs.org — AFAICT,Windows 上的节点仍在整理中。
【解决方案2】:

我怀疑您的响应缺少 Web-Socket-Protocol 标头。如果客户端发送一个协议列表(1 个或多个),那么服务器必须选择一个并在响应中返回它。

此外,您的回复应以“\r\n\r\n”结尾。

【讨论】:

    【解决方案3】:

    我不知道 node.js,所以它可能会为你做这个,但是......

    您的响应不应该以 \r\n\r\n 结尾吗?至少看起来您的接受标头缺少 \r\n...

    【讨论】:

    • 嗨。这就是问题所在,它现在连接了。我曾尝试使用 \r\n 这显然还不够。非常感谢
    猜你喜欢
    • 2011-12-16
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多