Websockety - why u no work (próba zgrania ich z własnym serwerem)

0

Piszę sobie pewien program, który ma wbudowany serwer HTTP do serwowania kilku plików i obsługi poleceń i chciałbym requesty AJAXowe zamienić na komunikację opartą o websocket. Zacząłem się wgryzać jak to działa, przewałkowałem RFC 6455, i ustawiłem zwracanie odpowiednich nagłówków i... i nic.

Podgląd przesyłanych nagłówków:
argh.png

Zgodnie z RFC6455 checklista tego co ma zwrócić serwer:
1. A Status-Line with a 101 response code as per RFC 2616 [RFC2616]. Such a response could look like "HTTP/1.1 101 Switching Protocols". - jest
2. An |Upgrade| header field with value "websocket" as per RFC 2616 [RFC2616]. - jest
3. A |Connection| header field with value "Upgrade". - jest
4. A |Sec-WebSocket-Accept| header field. - jest, klucz jest wyliczany poprawnie bo mam identyczny wynik dla pokazanego w RFCku przykładu

Natomiast tak wygląda debug log z socket.io

20:41:33.744 socket.io-client:url "parse http://localhost" +0ms  socket.io.js:1:3675
20:41:33.745 socket.io-client "new io instance for http://localhost" +1ms  socket.io.js:1:3675
20:41:33.746 socket.io-client:manager readyState closed +2ms  socket.io.js:1:3675
20:41:33.746 socket.io-client:manager "opening http://localhost" +0ms  socket.io.js:1:3675
20:41:33.747 engine.io-client:socket creating transport "websocket" +1ms  socket.io.js:1:3675
20:41:33.749 engine.io-client:socket setting transport websocket +2ms  socket.io.js:1:3675
20:41:33.750 socket.io-client:manager connect attempt will timeout after 20000 +1ms  socket.io.js:1:3675
20:41:33.751 socket.io-client:manager readyState opening +1ms  socket.io.js:1:3675
20:41:42.556 Połączenie z ws://localhost/socket.io/?EIO=3&transport=websocket zostało przerwane podczas wczytywania strony.
20:41:53.751 socket.io-client:manager connect attempt timed out after 20000 +20s  socket.io.js:1:3675
20:41:53.753 engine.io-client:socket socket close with reason: "forced close" +1ms  socket.io.js:1:3675
20:41:53.754 engine.io-client:socket socket closing - telling transport to close +1ms  socket.io.js:1:3675
20:41:53.755 socket.io-client:manager connect_error +1ms  socket.io.js:1:3675
20:41:53.755 socket.io-client:manager cleanup +1ms

Łączę się za pomocą takiego kodu (musiałem ustawić transport, bo domyślnie socket.io zaczyna jako polling xhr i dogaduje się z serwerem socket.io do zmiany na websocket).

socket = new io('http://localhost', {
    transports: ['websocket']
});

Ktoś ma jakiś pomysł? Bo kompletnie nie rozumiem co tu się dzieje, handshake wydaje się ok, po tym, żadne dane nie przychodzą, więc nie mam nawet jak ping/pong dorabiać.

Zapomniałem tez napisać, że sam serwer piszę w FPC za pomocą Synapse. Każde połączenie ma tworzony nowy wątek z socketem i sobie żyje tak długo ten wątek aż przeglądarka nie rozłączy połączenia, albo nie zamknę programu.

0

korzystasz z socket.io to nie jest biblioteka która używa tylko websocketów. Jest to rozbudowana biblioteka która sprawdza najpierw co da rade obsłużyć klient i dopiero następuje łączenie, masz 3 tryby: websockety, comet i najzwyklejsze walenie co sekundę requestem. Podsumowując, nie wiem co ty tam za nagłówki ustawiasz ale socket.io wymaga i biblioteki po stronie serwera i jej klienta po stronie przeglądarki a resztą sama się już zajmie.
Jeśli chcesz użyć czystych websocketów to nie używaj socket.io

0
mr_jaro napisał(a):

korzystasz z socket.io to nie jest biblioteka która używa tylko websocketów. Jest to rozbudowana biblioteka która sprawdza najpierw co da rade obsłużyć klient i dopiero następuje łączenie, masz 3 tryby: websockety, comet i najzwyklejsze walenie co sekundę requestem.

Ustawiłem transport na websocket (domyślnie jest polling, o czym pisałem), więc teoretycznie powinno coś zadziałać (a przynajmniej tak sobie założyłem). Problem jest pewnie w tym, że pewnie dodają jakieś pakiety kontrolne między sobą, które kontrolują połączenie, a bez których nic nie działa.

mr_jaro napisał(a):

Podsumowując, nie wiem co ty tam za nagłówki ustawiasz

Są przeca na screenie :P

mr_jaro napisał(a):

ale socket.io wymaga i biblioteki po stronie serwera i jej klienta po stronie przeglądarki a resztą sama się już zajmie.
Jeśli chcesz użyć czystych websocketów to nie używaj socket.io

I tak na prawdę do tego mogła się odpowiedź ograniczyć ;) Miałem błąd w obsłudze ramki, którego po całym dniu kodzenia nie wyłapałem i dlatego sądziłem, że pure websockety też nie działają. Dzięki za te sprostowanie!

0

Kontynuacja tematu. Wysyłanie i odbieranie stringów gra i buczy. Problem mam z danymi binarnymi. Wysyłam tablicę 128 floatów z serwera, odbieram 512 bajtów, robię z tego Float32Array i mam 128 elementów, problem w tym, że element pierwszy z tych wysłanych jest na pozycji 80 w odebranych, na 81 jest drugi itd, a pozycje 0-79 to jakieś kompletne śmieci o wartości typu 2.4083749348732749e-38 (a wysyłam wartość = indeksowi tablicy, czyli 0, 1, 2, 3, 4, itd i na pozycji 80 odebranej tablicy pojawia się 0, na 81 jest 1, itd).

Wysyłam pojedynczy bajt o wartości 11, odbieram pojedynczy bajt o wartości 80.

Sprawdzałem też różne warianty z endianess, ale skoro działam na localhoscie to nie powinno mieć znaczenia (i nie ma, bo tak czy siak wychodzą śmiecie).

// Editka
Ok, nieważne, synapse jakoś strasznie dziwnie wysyła bloki pamięci, jak wysyłam bajt po bajcie to jest ok... :U

1 użytkowników online, w tym zalogowanych: 0, gości: 1