Wie verarbeitet man einen einfachen Websocket-Frame?

Ich schreibe meine eigene Implementierung für Web-Sockets anstelle von socket.io und dergleichen.

Ich habe einen guten Handschlag, aber wenn der Client an den Server sendet, kann ich nicht herausfinden, wie ich diese Daten in nützliche Daten verwandeln kann. Ist es ein Objekt? Ist es eine Zeichenfolge? In der Dokumentation wird angegeben, dass es sich um eine Reihe von unformatierten Speicherorten außerhalb des V8-Heap handelt. ...?

FUNKTIONSBEISPIEL (Client ist ein fest codierter String)

var http = require("http");
var crypto = require("crypto");
var server = http.createServer();
server.on("upgrade", function (req, socket, upgradeHead) {
    var crypto = require("crypto");
    var shasum = crypto.createHash("sha1");
    shasum.update(req.headers["sec-websocket-key"]);
    shasum.update("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
    var hash = shasum.digest("hex");
    var myVal = new Buffer(hash, "hex").toString('base64');

    var head = "";
    head += "HTTP/1.1 101 Switching Protocols\r\n";
    head += "Connection: Upgrade\r\n";
    head += "Upgrade: WebSocket\r\n";
    head += "Sec-WebSocket-Accept: " + myVal + "\r\n\r\n";

    socket.setEncoding("utf8");
    socket.write(head);

    socket.ondata = function (data, start, end) {
        var data = data.toString("utf8", start, end);
        console.log(" start: " + start + "\n end: " + end + "\n data: " + data);
    };
});
server.on("request", function (req, res) {
    if (req.url === "/e")
        process.exit();
    if (req.url.indexOf("favicon") !== -1)
        return;

    var html = "\
                <!DOCTYPE html>\r\n\
                <html>\r\n\
                    <head>\r\n\
                        <script>\r\n\
                            var connection = new WebSocket('ws:localhost:80');\r\n\
                            connection.onopen = function () {\r\n\
                                console.log('OPEN SUCCESS');\r\n\
                                connection.send('I am a message from the client.');\r\n\
                            };\
                            connection.onmessage = function(msg) {\r\n\
                                console.log(msg);\r\n\
                            }\r\n\
                            connection.onerror = function (e) { console.log('ERROR'); console.log(e); };\r\n\
                            connection.onclose = function (e) { console.log('CLOSE'); console.log(e);};\r\n\
                        </script>\r\n\
                    </head>\r\n\
                </html>";
    res.writeHead(200, { "Content-Type": "text/html" });
    res.write(html);
    res.end();
});
server.listen(80);

Knoten docs - socket.on (data, myFunc);

node docs - Pufferobjekt

Tutorial, das ich benutze

Detaillierte WebSocket-Dokumentation

eazy-peezy wikipedia handshake erklärung

Antworten auf die Frage(1)

Ihre Antwort auf die Frage