Как узнать, какую версию веб-сокета использует клиент? - PullRequest
3 голосов
/ 13 марта 2012

Я написал (не очень) простой сервер веб-сокетов на python, который прослушивает порт, выполняет квитирование, а затем отправляет клиенту последовательность сообщений (с произвольным интервалом), содержащих числа.

Я написал клиент javascript и протестировал его в Chrome и Safari. Я обнаружил, что Chrome и Safari используют разные версии WebSocket. Например, Chrome использует Sec-WebSocket-Key (и ожидает Sec-WebSocket-Accept), тогда как Safari отправляет вместо Sec-WebSocket-Key1, Sec-WebSocket-Key2 и пакет из 8 байтов после заголовка.

Я реализовал на сервере функцию рукопожатия, которая определяет необходимый тип рукопожатия и выполняет его. Эта проблема решена. Веб-сокет правильно открыт в Chrome или Safari (версии OSX, Windows и IOS5).

Но у меня есть другая проблема. Очевидно, Safari отправляет и ожидает сообщения, разделенные 0x00 и 0xFF, в то время как Chrome отправляет и ожидает данные в рамке и в маске (используя более новую версию спецификации websocket).

Я хочу иметь один сервер, который адаптируется под ожидания клиента. У меня вопрос, как я могу заранее узнать, нужно ли отправлять данные в рамке или с разделением 0x00,0xFF?

Полагаю, я мог бы предположить, что, если протокол квитирования основан на Key1 и Key2, клиентом является Safari, а затем используется 0x00 0xFF для разграничения данных, тогда как если он использует Sec-WebSocket-Key, клиентом является Chrome, и затем используйте данные в рамке. Однако я не удовлетворен этим решением, так как оно не является общим. Идеи?

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Опубликованы стандарты как для варианта протокола hixie-76 , используемого Safari (для настольных ПК и мобильных устройств), так и для RFC 6455 , используемого Chrome и другими.

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

1 голос
/ 18 августа 2013

Чтобы ответить на ваш первоначальный вопрос, поскольку у меня была такая же потребность, я обнаружил, что window.WebSocket.CLOSED равен 3 в последней реализации, а в более старой - 2 (например, собственный браузер Android).

Итак, тест, который я сейчас провожу для обнаружения поддержки новейшего протокола WebSocket:

if('WebSocket' in window
    &&'function' === typeof window.WebSocket
    &&3 === window.WebSocket.CLOSED) {
// hurra !
}

Я тестировал его в Chrome, Firefox (там, где это удается) и в браузере Android (там, где он не работает). Жаль, что это поможет некоторым людям там.

0 голосов
/ 14 марта 2012

Простой: это только одна версия WebSockets. Остальные - шашки. Теперь, когда RFC вышел, вам официально рекомендуется не реализовывать ничего другого. В последних версиях Firefox и Chrome реализована версия RFC, и они автоматически обновляются. Черновики перестанут использоваться клиентами очень быстро, поэтому нет смысла пытаться реализовать их, даже чтобы получить немного больше функциональной совместимости.

Они больше не актуальны, и добавьте кавычки. Ни один из поставщиков браузеров не намерен продолжать поддерживать черновики. Действительно, Mozilla подождал до спецификации, прежде чем префиксировать объект websocket. Аналогичным образом поставщики браузеров ясно заявили, что любые приложения, написанные для черновиков, должны быть демонстрационными, а не производственными кодами, и не ожидается, что они будут поддерживать черновые серверы больше, чем они поддерживают черновой код клиента.

Итак, придерживайтесь одной спецификации и забудьте о ранних реализациях черновиков.

...