2011-09-09 25 views
6

Obecnie pracuję z WebSocket i serwera PHP: działa bardzo dobrze z Google Chrome i Opera, ale nie w Firefoksie 6.JavaScript i WebSockets: przy użyciu określonego protokołu

myślę, że to ze względu na wersji protokołu ten ostatni używa: widzę gdzieś, że używa siódmej wersji, podczas gdy jest starsza dla Google Chrome i Opery.

Więc mój zmodyfikowany kod serwera w celu zarządzania nowej wersji: od mieszania bezpieczny klucz z 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 i innych pasz, Firefox uda się połączyć. Ale jeśli inny klient chce się połączyć (nawet inny Firefox), pierwszy z Firefoxem sam się rozłącza.

Widziałem, że bufor otrzymanych przez socket_recv() jest albo pusta lub mieszany ...

więc postanowiłem pominąć idei zarządzania protokół używany przez Firefoksa 6 (nie istnieją żadne dokumenty w Internecie ... !): Myślę, że łatwiej byłoby określić protokół do użycia bezpośrednio w JavaScript.

Na this page mówią, że możemy napisać tak:

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

Ale co powinniśmy napisać zamiast „moja-custom-protocol” w celu korzystania z protokołu zarządzanej przez Google Chrome i Opera?

Z góry dziękuję!

+0

Istnieje wersja "hybi-00", która jest również nazywana 'hixie-76' i zawiera dwa klucze binarne. Istnieje również nowy "hybi-07", który wykorzystuje ten bezpieczny klucz, który opublikowałeś. Będziesz musiał wygenerować poprawny uścisk dłoni w zależności od wersji, której dotyczy żądanie * uzgadniania *. Ponieważ obie wersje używają różnych nazw nagłówków dla kluczy, powinno to być możliwe. – pimvdb

+0

Dzięki za odpowiedź! Więc próbowałem tego: 'var mySocket = new WebSocket (" http://www.example.com/socketserver "," hybi-00 ");' ale nagłówek wysyłany przez Firefoksa jest wciąż taki sam ... Jedyną różnicą jest teraz _Sec-WebSocket-Protocol: hybi-00_ w nagłówku, ale nadal używa siódmej wersji. – KorHosik

+0

Myślę, że nie byłem w pełni jasny. Każda przeglądarka wysyła jedną z wersji i nie można jej kontrolować. Na serwerze można jednak sprawdzić, która wersja została wysłana i odpowiednio zareagować (tj. Prawidłowa odpowiedź uzgadniania). – pimvdb

Odpowiedz

10

Opcja protokół do konstruktora websocket jest naprawdę „sub-protocol” (często nazywany przez tą nazwą) i jest to sub-protokołem poziomu aplikacji. Nie ma żadnego wpływu na rzeczywistą wersję protokołu WebSocket. Przeglądarki zasadniczo obsługują jedną wersję samego protokołu WebSocket. Większość serwerów obsługuje kilka wersji protokołu.

Firefox 6.0 wprowadzono wsparcie dla nowej serii HyBi protokołów (HyBi-00 jest tak naprawdę kopią protokołu Hixie-76). Wersje HyBi wprowadzają nowy format ramek dla danych i nie są jedynie zmianą w uzgadnianiu. Chrome 14 również korzysta z nowej serii protokołów HyBi.

Oto najnowsza wersja protokołu WebSockets: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-14, chociaż firefox 6.0 jest w rzeczywistości tym http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07, ale nie ma tak naprawdę wielu zmian (głównie tekstowych zmian w samej specyfikacji).

Czy jesteś pewien, że Firefox jest z powodzeniem łączący (czyli czy rzeczywiście uzyskać onOpen zdarzenie w przeglądarce)?

+0

Thanls za te wyjaśnienia! Rzeczywiście otrzymałem jedno zdarzenie, dlatego przypuszczam, że problem wynika ze sposobu wysyłania wiadomości (i pimvdb potwierdziło to ^^). Pobrałem i przetestowałem w Google Chrome 14 i pojawił się ten sam problem ... Zarządzaj WebSockets wydaje się być teraz tak trudny, myślę, że będę używał Node.js lub czegoś innego ^^ ' – KorHosik

+0

Możesz chcieć rzucić okiem na stronie [Socket.IO] (http://socket.io), która jest warstwą WebSocket, która działa na Node.js i obsługuje zarządzanie sesjami (i ma również funkcję powrotu do długiej ankiety, jeśli WebSockets nie jest obsługiwany przez przeglądarkę). – kanaka

+0

@KorHosik, także jeśli uważasz, że to wystarczająco odpowiedział na twoje pytanie, nie zapomnij wybrać odpowiedzi dla następnych (i dla reputacji oczywiście ;-)). – kanaka

Powiązane problemy