【问题标题】:node.js and javascript websockets communicationnode.js 和 javascript websockets 通信
【发布时间】:2012-09-26 01:36:03
【问题描述】:

我正在尝试访问网页以使用 websockets 与 node.js 进行通信。 我已经尝试了几个小时,但根本不知道出了什么问题。

服务器

var net = require('net');

var server = net.createServer(function (socket) {

    var handsShaked=false;

    socket.on('data', function(data) {
        if(!handsShaked){
            data=(data+"").split("\r").join("").split("\n");
            var key=null;
            for(i in data){
                if(data[i].indexOf("Sec-WebSocket-Key:")===0)
                    key=data[i].split(":")[1].split(" ").join("");
            }

            var magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            var sha = sha1(key+magic);
            var accept = new Buffer(sha).toString('base64');

            socket.write(
                "HTTP/1.1 101 Switching Protocols\r\n"+
                "Upgrade: websocket\r\n"+
                "Connection: Upgrade\r\n"+
                "Sec-WebSocket-Accept: "+accept+"\r\n"
            );

            handsShaked=true;
        }

        socket.write("test");
    });
});

server.listen(10666);

客户

socket = new WebSocket("ws://localhost:10666");
socket.onopen=function(){
    console.log('open');
    socket.send('Dit is een test');
}
socket.onmessage=function(msg){
    console.log('msg');
    alert(msg);
}
socket.onerror = function (error) {
    console.log('error');
    alert('WebSocket Error ' + error);
};

有人知道它为什么不工作吗?

【问题讨论】:

  • 您有任何错误吗?你的控制台会显示什么?
  • 没有错误。当用户因为断开连接而离开时,套接字将被打开并且在 node.js 中我可以登录。没有任何客户端事件被触发。

标签: javascript html node.js websocket


【解决方案1】:

您在握手响应结束时缺少最后一个 \r\n

查看 HTTP rfc2616

   Response      = Status-Line               ; Section 6.1
                   *(( general-header        ; Section 4.5
                    | response-header        ; Section 6.2
                    | entity-header ) CRLF)  ; Section 7.1
                   CRLF
                   [ message-body ]          ; Section 7.2

您的代码在响应后缺少CRLF

一旦握手开始工作,socket.write("test"); 行将无法按预期工作。 Websocket 消息是framed,因此您需要额外的代码来读取和写入消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 2013-09-18
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多