Двоичный файл Chrome 16 - PullRequest
       18

Двоичный файл Chrome 16

1 голос
/ 19 ноября 2011

Я пытаюсь настроить сервер websocket в node.js, но возникают проблемы. Я нашел битовый код здесь на stackoverflow и вот код сервера, который у меня сейчас:

var net = require("net"), crypto = require("crypto"), users = [];

net.createServer(function(socket) {
    this.name = "Anonymous";
    users.push(socket);     

    socket.on('data', function(buffer) {
        if(buffer.toString('utf-8').substring(0, 14) === "GET / HTTP/1.1") {
            this.securyPattern = /Sec-WebSocket-Key: (.*)/g;
            this.key = this.securyPattern.exec(buffer);
            this.magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            this.sha1 = crypto.createHash("sha1");
            this.sha1.update(this.key[1] + this.magic);
            this.accept = this.sha1.digest("base64");
            socket.write("HTTP/1.1 101 Switching Protocols\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + this.accept + "\r\n\r\n");
        } else {
            console.log(buffer);
            console.log(buffer.toString('utf-8'));
        }
    });

    socket.on('end', function() {
        users.splice(users.indexOf(socket), 1);
    });
}).listen(1337);

Все работает нормально, когда подключается, и users.length обновляется, когда это происходит и когда кто-то отключается.

Проблема в том, что я не знаю, как читать сообщения, кроме заголовка (который представляет собой простой текст), поэтому строки, которые я должен печатать в буфер и buffer.toString ('utf-8'), печатают только что-то другое все время, пример для слова "привет":

<Buffer 81 85 71 dc c1 02 19 b9 ad 6e 1e>
??q??☻↓??n▲
<Buffer 81 85 8e 8f 0f a2 e6 ea 63 ce e1>
????☼???c??

Я посылаю это "привет" с Chrome 16, используя: myWebSocket.send ( "Привет"); где myWebSocket - это объект WebSocket.

Так как мне читать и записывать сообщения в сокет с этим?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Обратите внимание, что после рукопожатия данные помещаются в 2 или более байтов заголовка в начале каждого кадра. Также обратите внимание, что полезная нагрузка, отправляемая с клиента (браузера) на сервер, маскируется с помощью простой 4-байтовой рабочей маски XOR.

Определение кадра определено в разделе 5 спецификации

Вместо реализации собственного сервера WebSocket в Node вы можете рассмотреть возможность использования абстракции более высокого уровня, например Socket.IO .

1 голос
/ 19 декабря 2011

Вот мой код обработки этого буфера:

socket.ondata = function(src,start,end) {
    src = src.slice(start,end);
    var maskKeys = [src[2],src[3],src[4],src[5]];
    var dest = new Array();
    for(var i=0;i<src.length-6;i++){
        var mKey = maskKeys[i%4];
        dest[i] = mKey ^ src[6+i];
    }
    console.log(new Buffer(dest).toString());
}

Найдено здесь: http://songpengfei.iteye.com/blog/1178310

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...