Сервер WebSocket, использующий новейший протокол (hybi 10) - PullRequest
4 голосов
/ 14 августа 2011

Я просматривал форумы здесь, и это был самый близкий вопрос, который я нашел:

Как (де) построить фреймы данных в WebSockets hybi 08 +?

Разница в том, что я не могу получить успешное рукопожатие.Я предполагаю, что кадрирование не играет роли, пока ПОСЛЕ рукопожатия не будет, это правильно?

Я собирался запустить проверку концепции, когда Chrome удобно обновился до версии 14, которая использует веб-сокет HyBi 10протокол (http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10). На основе информации в спецификации о рукопожатии (http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10#section-5.2.2) Мне удалось успешно создать ключ Sec-WebSocket-Accept (успех на основе их примера), но нана стороне клиента функция socket.onopen никогда не срабатывает.

В прошлый раз, когда у меня возникла проблема с рукопожатием протокола WebSocket, это была проблема с завершением рукопожатия правильными байтами (или я полагаю, что символы более точные?Я использую PHP для текущей реализации, и это означало попытку декодировать реализации Python или C #, но пока безуспешно.

Вот мой Javascript на стороне клиента, работающий в Chrome 14 (для Windows):

var socket;
socket = new WebSocket(host);
socket.onopen = function(msg){
    // process onopen
};
socket.onmessage = function(msg){ 
    // process message
};
socket.close = function(msg){
    // process close
};

А вот мой серверный PHP-код для рукопожатия:

function dohandshake($user,$buffer){
    // getheaders and calcKey are confirmed working, can provide source if desired
    list($resource,$host,$origin,$key,$version) = $this->getheaders($buffer);
    $request = "HTTP/1.1 101 Switching Protocols\r\n" .
            "Upgrade: WebSocket\r\n" .
            "Connection: Upgrade\r\n" .
            "Sec-WebSocket-Accept: " . $this->calcKey($key) . "\r\n";
    socket_write($user->socket,$request);
    $user->handshake=true;
    return true;
}

ОднаждыКлиент отправляет начальное рукопожатие, сокет Javascript остается в состоянии CONNECTING в течение неопределенного времени.Это означает, что онопен никогда не срабатывает, и поэтому мой сокет остается в подвешенном состоянии.Любые идеи о том, как отлаживать или даже лучше подтверждать мой подход рукопожатия, были бы великолепны.

Вот очевидное (я не могу сказать, работает ли оно наверняка или нет) решение в Python (https://github.com/kanaka/websockify/blob/master/websocket.py). Найдите метод do_handshake.

Спасибо!

Ответы [ 4 ]

5 голосов
/ 14 августа 2011

Так что я решил мою конкретную проблему с рукопожатием, и это было довольно нюби. Мне нужно было два набора "\ r \ n", чтобы закрыть рукопожатие. Поэтому, чтобы исправить проблему рукопожатия, которую я описал выше (WebSocket Javascript не переходит в состояние ОТКРЫТО), мне нужно было внести следующее изменение в мой серверный PHP (обратите внимание на \ r \ n \ r \ n в конце, дох) :

function dohandshake($user,$buffer){
    // getheaders and calcKey are confirmed working, can provide source if desired
    list($resource,$host,$origin,$key,$version) = $this->getheaders($buffer);
    $request = "HTTP/1.1 101 Switching Protocols\r\n" .
        "Upgrade: WebSocket\r\n" .
        "Connection: Upgrade\r\n" .
        "Sec-WebSocket-Accept: " . $this->calcKey($key) . "\r\n\r\n";
    socket_write($user->socket,$request);
    $user->handshake=true;
    return true;
}

Также для будущих энтузиастов PHP-WebSocket я просто использую регулярные выражения для разбора заголовка в getheaders, а это calcKey:

function calcKey($key){
     $CRAZY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
     $sha = sha1($key.$CRAZY,true);
     return base64_encode($sha);
}

Надеюсь, это поможет кому-то еще! Теперь поработаем над кадрированием сообщения ...

1 голос
/ 20 октября 2011

Вот мое решение этой проблемы.Пожалуйста, напишите здесь, если когда-нибудь в далеком будущем этот код перестанет работать!

https://github.com/esromneb/phpwebsocket/blob/master/websocket.class.php

Проверьте мой подкаст для получения дополнительных советов хакеров!http://portforwardpodcast.com/

0 голосов
/ 14 августа 2011

Другое дело ... вы можете протестировать поддержку hybi10 на JsBin. Там есть многокомнатный чат со всем редактируемым кодом.

Там нет вспышки и запасного варианта серебряного света!

http://jsbin.com/ohitil

/ Uffe

0 голосов
/ 14 августа 2011

xsockets.net предоставляет серверное решение в c #, если это нормально? Однако вам не нужно писать какой-либо серверный код, чтобы делать то, что вы пытаетесь сделать выше. Используйте универсальный обработчик и пишите только JavaScript.

XSockets имеет многопротокольную поддержку вплоть до Hybi10 с кросс-браузерной функциональностью и откатом к Silverlight и Flash. Также поддержите плагины для протоколов, обработчиков и перехватчиков, если вы хотите написать свои собственные протоколы и т. Д. См. Демонстрацию на http://youtu.be/MDz1jJJeXKI?hd=1

Документы на http://xsockets.net/Documentation/Index

С наилучшими пожеланиями Uffe

...