HTML5: последние веб-сокеты - PullRequest
1 голос
/ 29 июня 2010

Кто-нибудь читал протокол WebSocket от Hickson's draft-hixie-thewebsocketprotocol-76 от мая 2010 года?

Вот источник файла .htm:

<html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript">
        var socket = new WebSocket('ws://localhost:8181/websession');
        socket.onopen = function() {
            alert('handshake successfully established. May send data now...');
        };
        socket.onclose = function() {
            alert('connection closed');
        };
    </script>
</head>
<body>
</body>
</html>

Если у меня есть порт TCP, прослушивающий 8181, это запрос, который я получаю, когда загружаю вышеупомянутый файл .htm в Chrome:

GET /websession HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8181
Origin: null
[\n]

(где [\ n] - символ CRLF.)

Что я должен вернуть к открывателю рукопожатия? draft-hixie-thewebsocketprotocol-76 показывает:

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Location: ws://example.com/demo
Sec-WebSocket-Protocol: sample

8jKS'y:G*Co,Wxa-

Этот ответ вызывает срабатывание socket.onclose.

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

Черновик 76 переименовал заголовки ответа WebSocket- в Sec-WebSocket- и добавил ненужные некрасивые заголовки Key и криптографию тела запроса, на которые 8jKS'y:G*Co,Wxa- является ответом. Но это только правильный ответ для примера, включенного в черновик; возвращать эту конкретную строку для любого другого запроса бесполезно. См. этот пост для объяснения того, как реализовать новый протокол.

В любом случае, если вы не используете последние версии разработки, Chrome / Chromium по-прежнему будет использовать старый протокол черновика 75 (как показывает запрос, который вы разместили) и не будет общаться с сервером, который реализует новую протокол. См. Chromium blog для получения дополнительной информации. Если вам требуется поддержка старых / текущих версий Chrome, вам фактически необходимо реализовать два протокола WebSocket.

Это всегда риск при разработке материала на основе протокола, который еще не стандартизирован. Вы можете ожидать раздражающей интероперабельности, пока WebSocket не будет завершен; Вы можете предпочесть подождать до тех пор.

(Попытка действительно прочитать спецификацию и выяснить, что именно изменилось среди множества нечитаемых алгоритмов синтаксического анализа, - упражнение в разочаровании. Я понятия не имею, почему оно написано так вместо обычных спецификаций BNF-стиля Как будто Хикси написал парсер на C, а затем написал автоматизированный инструмент для преобразования кода в английский. C был бы более читабельным TBH.)

0 голосов
/ 14 октября 2010

Вы можете найти wsproxy, включенный в noVNC, полезным для справки. Он прозрачно поддерживает клиенты WebSockets v75 и v76.

wsproxy - это универсальный прокси сокета WebSockets to TCP. Существует также версия wsproxy для C и Python, включенная в noVNC.

http://github.com/kanaka/noVNC/tree/master/utils/

Кроме того, просто чтобы сделать вещи интересными, последний (пока нет версии) черновой вариант предложения снова меняет ситуацию (в частности, он меняет структуру): http://www.whatwg.org/specs/web-socket-protocol/

...