WebSocket w Node.js: serwer, klient, heartbeat i ponowne łączenie

WebSocket w Node.js: serwer ws, wbudowany klient, heartbeat | We.Inc

Zbuduj serwer WebSocket w Node.js z pakietem ws, połącz się wbudowanym klientem WebSocket z Node, wykrywaj martwe sockety przez ping i pong i łącz się ponownie z backoffem.

Node.js nie ma wbudowanego serwera WebSocket, więc większość projektów instaluje pakiet ws i tworzy WebSocketServer. Po stronie klienta Node dostarcza globalny WebSocket zgodny z przeglądarką, dodany w v21.0.0 i v20.10.0, dostępny bez flagi od v22.0.0 i oznaczony jako stabilny w v22.4.0. Przed startem produkcyjnym dodaj heartbeat ping i pong oraz ponowne łączenie z backoffem.

Który element za co odpowiada

Ten poradnik buduje po kolei jeden mały serwer w stylu czatu i klientów, którzy z nim rozmawiają: serwer, który odsyła echo i rozgłasza wiadomości, skrypt Node, który łączy się bez żadnych zależności, heartbeat, który odrzuca połączenia po cichu martwe, oraz klienta, który wraca po restarcie serwera. Poniższy kalkulator pokazuje, jak rosną opóźnienia ponownych prób, zanim wpiszesz je w kod.

Najczęściej zadawane pytania

Czy Node.js ma wbudowany WebSocket?

Tylko klienta. Globalna klasa WebSocket pojawiła się w v21.0.0 i v20.10.0 za flagą --experimental-websocket, straciła flagę w v22.0.0 i przestała być eksperymentalna w v22.4.0. Wbudowanego serwera nadal nie ma, dlatego ws pozostaje typowym wyborem.

Używać ws czy Socket.IO?

ws mówi czystym protokołem WebSocket, więc połączyć się może każdy standardowy klient, w tym przeglądarka i globalny WebSocket z Node. Socket.IO dokłada na wierzch własny protokół z pokojami i automatycznym ponownym łączeniem, ale po drugiej stronie wymaga własnej biblioteki klienta.

Dlaczego połączenia umierają bez zdarzenia close?

Gdy ścieżka sieciowa znika, na przykład po zamknięciu klapy laptopa, żadna ramka close nie zostaje wysłana, a serwer trzyma półotwarty socket. Heartbeat je wyłapuje: socket, który nie odpowiedział na ostatni ping, zostaje zakończony w kolejnej rundzie.

Czy klient w przeglądarce może wysyłać pingi?

Nie. API przeglądarki ma tylko send() i close(). Przeglądarki same odpowiadają na pingi serwera pongami, dlatego heartbeat po stronie serwera działa także z klientami w przeglądarce.

Jak współdzielić port z serwerem HTTP?

Utwórz serwer HTTP samodzielnie, na przykład z Express lub node:http, a potem przekaż go jako new WebSocketServer({ server }). Żądania upgrade trafiają do ws, a zwykłe żądania do Twojej aplikacji.

Jak zaczyna się połączenie

Heartbeat prostymi słowami

Ponowne łączenie bez zasypywania serwera

Krok 1: serwer z ws

server.js: echo i rozgłaszanie

Każda wiadomość jest odsyłana do wszystkich otwartych klientów. Listener error sprawia, że jeden wadliwy socket nie wyłoży procesu.

Krok 2: klient bez zależności

client.js: globalny WebSocket z Node

Działa bez zmian na Node 22 lub nowszym i w konsoli przeglądarki, bo oba udostępniają tę samą klasę WebSocket.

Krok 3: odrzucanie martwych połączeń przez ping i pong

Nasza wersja wzorca z README pakietu ws: oznacz jako żywy przy pongu, zakończ wszystko, co przegapiło ostatnią rundę.

Krok 4: klient, który łączy się ponownie

reconnect.js: wykładniczy backoff z jitterem

Opóźnienie podwaja się po każdej nieudanej próbie aż do pułapu, dostaje losowy rozrzut i zeruje się, gdy połączenie się otworzy.

Za nginx

nginx przepuszcza upgrade tylko wtedy, gdy sam przekażesz nagłówki Upgrade i Connection. Przed nginx 1.29.7 potrzebujesz też proxy_http_version 1.1.

location nginx dla socketu

proxy_read_timeout podnosi limit bezczynności 60 sekund, a heartbeat powyżej i tak utrzymuje ruch.

Kalkulator opóźnienia ponownego łączenia

Ustaw pierwsze opóźnienie, mnożnik i pułap, aby zobaczyć, jak długo klient czeka przed każdą ponowną próbą, oraz najkrótsze i najdłuższe oczekiwanie po dodaniu jittera.

Pierwsze opóźnienie (ms)

Mnożnik

Pułap (ms)

Liczba pokazanych prób

Dodaj jitter (czekaj od połowy do pełnego opóźnienia)

Oczekiwanie przed każdą próbą ponownego połączenia

Próba

Opóźnienie

Z jitterem

Łączny czas oczekiwania

{n} do {v} s

Te same ustawienia jako kod

Zacznij za darmo · Bez karty kredytowej

Powiązane: Poradniki

Produkt

Dla kogo

Funkcje

Zasoby

Firma

Mapa strony