Cykl życia połączenia i błędy
Proszę obsługiwać zdarzenia open, close i error.
Cykl życia połączenia i błędy to bezpłatna lekcja JavaScript Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej JavaScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs JavaScript Academy zawiera 4 lekcji w sumie.
Pełny cykl życia
Gniazdo przechodzi przez stany CONNECTING → OPEN → CLOSING → CLOSED. Tym przejściom odpowiadają cztery zdarzenia: open, message, error i close.
Zdarzenie onclose
onclose jest wywoływane po zakończeniu połączenia, niezależnie od tego, czy zakończyło się ono prawidłowo. Zdarzenie zawiera właściwości code, reason i wasClean.
socket.onclose = (event) => {
console.log("Closed", event.code, event.reason, event.wasClean);
};Kody zamknięcia
Do standardowych kodów należą 1000 (normalne zamknięcie), 1001 (opuszczanie strony), 1006 (nieprawidłowe zamknięcie bez ramki zamknięcia) i 1011 (błąd serwera). Kody 4000–4999 są definiowane przez aplikację.
socket.onclose = (e) => {
if (e.code === 1000) console.log("normal close");
else console.log("unexpected", e.code);
};Celowe zamykanie połączenia
socket.close(code, reason) rozpoczyna prawidłowe zamykanie połączenia. Do normalnego zamknięcia należy użyć 1000; ciąg znaków z uzasadnieniem musi mieć mniej niż 123 bajty.
socket.close(1000, "user logged out");Zdarzenie onerror
onerror jest wywoływane w przypadku błędów. Ze względów bezpieczeństwa zdarzenie błędu zawiera celowo niewiele informacji — nie podaje szczegółowej przyczyny. Niemal zawsze następuje po nim zdarzenie close.
socket.onerror = (event) => {
console.log("Socket error — a close will follow");
};Rozróżnianie zamknięcia prawidłowego i nieprawidłowego
event.wasClean ma wartość true tylko wtedy, gdy obie strony wymieniły ramki zamknięcia. Utrata połączenia sieciowego powoduje ustawienie wasClean: false i kodu 1006.
socket.onclose = (e) => {
if (!e.wasClean) console.log("Connection dropped unexpectedly");
};Zwalnianie zasobów
Po zamknięciu należy wyczyścić liczniki czasu (sygnały heartbeat), odrzucić oczekujące żądania i zaktualizować stan interfejsu, aby aplikacja odzwierciedlała rozłączenie.
socket.onclose = () => {
clearInterval(heartbeatTimer);
pending.forEach((reject) => reject(new Error("disconnected")));
pending.clear();
};Usuwanie procedur obsługi
Jeśli procedury obsługi zostały dołączone za pomocą addEventListener, należy usunąć je po zamknięciu, aby uniknąć wycieków pamięci, szczególnie podczas ponownego tworzenia gniazd.
function cleanup() {
socket.removeEventListener("message", onMessage);
socket.removeEventListener("close", onClose);
}readyState podczas zamykania
Między wywołaniem close() a zdarzeniem onclose właściwość readyState ma wartość CLOSING (2). Wysyłanie danych w tym czasie jest ignorowane.
socket.close();
console.log(socket.readyState); // 2 (CLOSING)Limity bezczynności ustalane przez serwery
Serwery i serwery proxy często zamykają bezczynne połączenia po 30–60 sekundach. Sygnały heartbeat utrzymują aktywność połączenia i pozwalają szybko wykrywać rozłączenia.
Wykrywanie nieaktywnego połączenia
Należy połączyć sygnały heartbeat z mechanizmem watchdog: jeśli w określonym czasie nie nadejdzie pong, należy uznać gniazdo za nieaktywne i zamknąć je, aby wywołać ponowne połączenie.
let pongTimer;
function ping() {
socket.send(JSON.stringify({ type: "ping" }));
pongTimer = setTimeout(() => socket.close(4000, "no pong"), 5000);
}
socket.onmessage = (e) => {
if (JSON.parse(e.data).type === "pong") clearTimeout(pongTimer);
};Szybki sprawdzian
Sprawdź obsługę cyklu życia połączenia.
Podsumowanie: cykl życia i błędy
Obsłużono onclose wraz z właściwościami code/reason/wasClean, poznano standardowe kody zamknięcia, celowo zamykano połączenia, obsłużono skąpe w informacje zdarzenie onerror, zwolniono liczniki czasu i procedury obsługi oraz zbudowano mechanizm watchdog dla sygnałów heartbeat. Następny temat: strategie ponownego łączenia.
Często zadawane pytania
Czy lekcja „Cykl życia połączenia i błędy” jest bezpłatna?
Tak — pełny tekst „Cykl życia połączenia i błędy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu JavaScript Academy, przejdź na CoddyKit PRO. Kurs JavaScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Cykl życia połączenia i błędy”?
Proszę obsługiwać zdarzenia open, close i error. Ćwiczysz JavaScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć JavaScript Academy?
Nie wymagamy żadnego doświadczenia. JavaScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Cykl życia połączenia i błędy”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji JavaScript Academy?
Tak. Każda lekcja JavaScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Otwieranie połączenia WebSocket
- Wysyłanie i odbieranie wiadomości
- Cykl życia połączenia i błędy
- Strategie ponownego łączenia