2011-09-09 3 views
6

В настоящее время я работаю с WebSockets и сервером PHP: это очень хорошо работает с Google Chrome и Opera, но не с Firefox 6.JavaScript и WebSockets: с использованием специального протокола

Я думаю, что это связано с версией протокола это последнее использует: я вижу где-то, что он использует седьмую версию, в то время как он более старый для Google Chrome и Opera.

Итак, я изменил мой код сервера, чтобы управлять этой новой версией: путем хэширования защищенного ключа с 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 и другие материалы, Firefox успешно подключиться. Но если другой клиент хочет подключиться (даже другой Firefox), первый с Firefox деконнектирует сам.

Я видел, что буфер, полученный socket_recv() либо пусто, либо хэшируются ...

Так что я решил пропустить идею управления протоколом, используемый Firefox 6 (нет никакой документации в Интернете ... !): Я думаю, было бы проще указать протокол для использования непосредственно в JavaScript.

На this page они говорят, что мы можем написать это:

var mySocket = new WebSocket("http://www.example.com/socketserver", "my-custom-protocol"); 

Но что мы должны писать вместо «мой обычай-протокол» для того, чтобы использовать протокол под управлением Google Chrome и Opera?

Заранее благодарен!

+0

Существует версия 'hybi-00', которая также называется' hixie-76' и включает в себя два двоичных ключа. Существует также новый 'hybi-07', который использует этот безопасный ключ, который вы разместили. Вам нужно будет создать правильное рукопожатие, в зависимости от того, в какой версии находится запрос * квитирования. Поскольку обе версии используют разные имена заголовков для ключей, это должно быть возможно. – pimvdb

+0

Спасибо за ваш ответ! Поэтому я пробовал это: «var mySocket = new WebSocket (« http://www.example.com/socketserver »,« hybi-00 ») ;, но отправка заголовков Firefox остается неизменной ... Единственное отличие теперь в том, что в заголовке есть _Sec-WebSocket-Protocol: hybi-00_, но он по-прежнему использует седьмую версию. – KorHosik

+0

Я думаю, что я не был полностью ясен. Каждый браузер отправляет любую версию, и вы не можете ее контролировать. На сервере, однако, вы можете проверить, какая версия была отправлена, и отреагировать соответствующим образом (т. Е. Правильный ответ подтверждения). – pimvdb

ответ

10

Параметр протокола для конструктора WebSocket на самом деле является «под-протоколом» (его часто называют этим именем), и это суб-протокол уровня приложения. Это не влияет на версию протокола WebSocket. Браузеры в основном поддерживают одну версию самого протокола WebSocket. Большинство серверов поддерживают несколько версий протокола.

В Firefox 6.0 появилась поддержка новых протоколов HyBi (HyBi-00 - это всего лишь копия протокола Hixie-76). В версиях HyBi представлен новый формат кадрирования данных и не просто изменение рукопожатия. В Chrome 14 также используется новая серия протоколов HyBi.

Вот самая последняя версия протокола WebSockets: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-14 хотя firefox 6.0 на самом деле это http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07, но на самом деле не так много реальных изменений (в основном текстовые изменения самой спецификации).

Вы уверены, что firefox успешно соединяется (т. Е. Вы действительно получаете onopen-событие в браузере)?

+0

Thanls для этих разъяснений! Я действительно получил событие onopen, поэтому я полагаю, что проблема связана с тем, как отправляются сообщения (а pimvdb подтвердил, что ^^). Я загрузил и протестировал с помощью Google Chrome 14 и возникла одна и та же проблема ... Управление WebSockets кажется таким сложным, я думаю, что буду использовать Node.js или что-то еще. ^^ ' – KorHosik

+0

Возможно, вам захочется взглянуть в [Socket.IO] (http://socket.io), который является слоем WebSocket, который работает на Node.js и обрабатывает управление сеансом (а также имеет откат к длинному опросу, если браузер не поддерживается WebSockets). – kanaka

+0

@KorHosik, также если вы считаете, что это правильно ответили на ваш вопрос, не забудьте выбрать ответ для тех, кто следует за ним (и для репутации, конечно ;-)). – kanaka

Смежные вопросы