Socket.IO to biblioteka JavaScript służąca do tworzenia aplikacji internetowych działających w czasie rzeczywistym. Umożliwia dwukierunkową komunikację między klientami webowymi a serwerami w czasie rzeczywistym. Składa się z dwóch części: biblioteki po stronie klienta działającej w przeglądarce oraz biblioteki po stronie serwera dla Node.js. Oba komponenty mają niemal identyczne API. Podobnie jak Node.js, jest sterowany zdarzeniami.
0: otwarte (Wysyłane przez serwer po otwarciu nowego transportu (ponowne sprawdzenie))
1: zamknięcie (żądanie zamknięcia tego transportu, bez zamykania samego połączenia).
2: ping (wysyłany przez klienta; serwer powinien odpowiedzieć pakietem pong zawierającym te same dane)
przykład
klient wysyła: 2probe
server sends: 3probe
3: pong (wysyłany przez serwer w odpowiedzi na pakiety ping.)
4: wiadomość tekstowa (właściwa wiadomość; klient i serwer powinny wywołać swoje wywołania zwrotne z danymi).
przykład:
42/chat,["join","{room:1}"]
4 to typ pakietu wiadomości w protokole engine.io
2 to typ EVENT w protokole socket.io
/chat to dane przetwarzane przez socket.io
socket.io wyzwoli zdarzenie "join"
przekaże dane "room: 1". Przestrzeń nazw można pominąć tylko wtedy, gdy wynosi /.
5: uaktualnienie (Przed przełączeniem transportu przez engine.io sprawdza on, czy serwer i klient mogą się ze sobą komunikować za pośrednictwem tego transportu. Jeśli test zakończy się sukcesem, klient wysyła pakiet uaktualnienia, żądając od serwera opróżnienia pamięci podręcznej na starym transporcie i przełączenia na nowy.)
6: noop (Pakiet noop. Używany przede wszystkim do wymuszania cyklu odpytywania, gdy odebrane zostanie przychodzące połączenie WebSocket).
API: określa wersję SocketIO:
ioAPI0: obsługuje serwery socket.io 0.* (wybrane domyślnie)
ioAPI1: obsługuje serwery socket.io w wersji 1.*
ioAPI2: obsługuje serwery socket.io 2.*
ioAPI3: obsługuje serwery socket.io 3.*
ioAPI4: obsługuje serwery socket.io w wersji 4.*
Base64: jeśli włączony, wiadomości binarne są odbierane w formacie base64.
HandShakeCustomURL: umożliwia dostosowanie adresu URL w celu pobrania sesji socket.io.
HandShakeTimestamp: należy włączyć tylko wtedy, gdy chcesz wysyłać znacznik czasu jako parametr przy żądaniu nowej sesji (włącz tę właściwość, jeśli próbujesz uzyskać dostęp do serwera Python gevent-socketio).
HandShakeAuthToken: jeśli serwer wymaga tokena do uwierzytelnienia, należy tu ustawić token uwierzytelniający.
Namespace: umożliwia ustawienie przestrzeni nazw podczas łączenia z serwerem.
Polling: wyłączenie tej właściwości powoduje, że klient łączy się bezpośrednio z serwerem przy użyciu WebSocket jako transportu.
Parametry: umożliwia ustawienie parametrów połączenia.
EncodeParameters: jeżeli jest włączone, parametry są kodowane.
Aby wysyłać wiadomości do serwera socket.io, należy użyć metody WriteData (zgodnie z sekcją Typy wiadomości).
1. Wywołaj metodę „add user" z jednym parametrem, używając wartości John jako nazwy użytkownika.
WriteData('42["add user", "John"]');
Przed nawiązaniem nowego połączenia WebSocket serwer socket.io wymaga, aby klient otworzył nowe połączenie HTTP w celu uzyskania nowego identyfikatora sesji. W niektórych przypadkach serwer socket.io wymaga uwierzytelnienia za pomocą nagłówków HTTP. Za pomocą tego zdarzenia można dodawać niestandardowe nagłówki HTTP, takie jak uwierzytelnianie Basic lub token Bearer.
To zdarzenie jest wywoływane po pomyślnym nawiązaniu połączenia socket.io i umożliwia klientowi wysyłanie wiadomości do serwera. Tutaj można na przykład subskrybować przestrzenie nazw.
Gdy serwer WebSocket wymaga bezpiecznych połączeń, przy próbie połączenia klienta z serwerem może pojawić się następujący komunikat o błędzie:
Error connecting with SSL. error:XXXXXXXX:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Błąd ten oznacza, że klient próbuje nawiązać połączenie przy użyciu wersji TLS, która nie jest obsługiwana przez serwer.
Aby rozwiązać ten błąd, należy obsłużyć OnSSLAfterCreateHandler komponentu klienta WebSocket i ustawić nowszą wersję TLS.
Na przykład: tutaj ustawiamy TLS 1.2 jako wersję protokołu.
procedure TfrmWebSocketClient.SOCKETIOHTTPConnectionSSL(Sender: TObject;
aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
TIdSSLIOHandlerSocketOpenSSL(aSSLHandler).SSLOptions.Method := sslvTLSv1_2;
end;