Веб-розетки Chrome 16 Hybi-17 - PullRequest
2 голосов
/ 16 ноября 2011

Я пытаюсь заставить сокеты работать с Chrome 16, который использует последний протокол для него: http://tools.ietf.org/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, и я использую этот адрес для моего веб-сервера, который работает нормально.

Код браузера (клиента) внутри тега script внутри заголовка:

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 он просто говорит, что закрытое соединение (никогда не открывается).

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Я не знаю node.js, поэтому он может сделать это для вас, но ...

Разве ваш ответ не должен заканчиваться на \ r \ n \ r \ n? По крайней мере, похоже, что в вашем заголовке подтверждения отсутствует \ r \ n ...

0 голосов
/ 16 ноября 2011

Вы пробовали смотреть на http://socket.io?имеет как узловой модуль, так и интерфейс

0 голосов
/ 16 ноября 2011

Я подозреваю, что в вашем ответе отсутствует заголовок Web-Socket-Protocol. Если клиент отправляет список протоколов (1 или более), сервер должен выбрать один и вернуть его в ответе.

Кроме того, ваш ответ должен заканчиваться на "\ r \ n \ r \ n".

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