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:
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.