WebSockets & Realtime Systems Programming · Lekcja

Obsługa rozłączeń i ponownych połączeń

Zaimplementuj logikę po stronie klienta i serwera do wykrywania rozłączeń oraz automatycznego podejmowania prób ponownego połączenia.

Lekcja 1 z 412 kroki

Obsługa rozłączeń i ponownych połączeń to bezpłatna lekcja WebSockets & Realtime Systems Programming na CoddyKit. To lekcja 1 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 WebSockets & Realtime Systems Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs WebSockets & Realtime Systems Programming zawiera 4 lekcji w sumie.

Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.

Why Connections Drop

In the real world, network connections aren't always perfect. WebSockets, despite being persistent, can break due to many reasons.

Ignoring these disconnections can lead to unresponsive applications and a poor user experience. This lesson explores how to gracefully handle these interruptions.

Causes of Connection Loss

What makes a WebSocket connection drop?

  • Network Issues: Wi-Fi drops, internet outages, proxy problems.
  • Server Restarts: The server application might restart for updates or maintenance.
  • Client Offline: The user closes their browser, loses power, or puts their device to sleep.
  • Idle Timeouts: Some proxies or firewalls might close idle connections.

Client Detects Disconnects

On the client side, the browser's native WebSocket API provides events to notify you about connection status changes.

The most important event for detecting a disconnection is the onclose event. It fires when the connection is either gracefully closed by the server or abruptly lost.

Simple Reconnect Attempt

When onclose fires, you can immediately try to reconnect. This simple approach works for temporary glitches but can be problematic.

Try running this basic client-side example:

let ws;
function connect() {
  ws = new WebSocket("ws://localhost:8080");

  ws.onopen = () => console.log("Connected!");
  ws.onmessage = (event) => console.log("Received:", event.data);
  ws.onerror = (error) => console.error("WebSocket Error:", error);

  ws.onclose = () => {
    console.log("Disconnected. Reconnecting...");
    setTimeout(connect, 1000); // Try again in 1 second
  };
}
connect();

Why Simple Retries Fail

Continuously trying to reconnect immediately (e.g., every 1 second) can overwhelm both the client and the server.

  • Client Resource Drain: Constant connection attempts consume CPU and network resources.
  • Server Overload: If many clients disconnect and then flood the server with reconnect requests, it can lead to a Denial of Service (DoS) situation.
  • No Backoff: It doesn't account for prolonged outages.

Smart Reconnection: Backoff

To prevent overloading and provide a better experience, we use reconnection backoff strategies.

A backoff strategy introduces delays between reconnection attempts, and these delays typically increase with each failed attempt. This gives the server time to recover and prevents a "thundering herd" problem.

Exponential Backoff Logic

Exponential backoff is a common and effective strategy. It means the delay between retries increases exponentially.

  • First retry: 1 second
  • Second retry: 2 seconds
  • Third retry: 4 seconds
  • Fourth retry: 8 seconds

You usually cap the maximum delay to prevent excessively long waits and add some random "jitter" to avoid synchronized retries.

Client with Exponential Backoff

Let's enhance our client-side code to use exponential backoff with a maximum delay and some random jitter. Try running it!

let ws;
let reconnectInterval = 1000; // Start with 1 second
const maxReconnectInterval = 30000; // Max 30 seconds
let reconnectTimer;

function connect() {
  ws = new WebSocket("ws://localhost:8080");

  ws.onopen = () => {
    console.log("Connected!");
    reconnectInterval = 1000; // Reset on successful connection
    clearTimeout(reconnectTimer);
  };
  ws.onmessage = (event) => console.log("Received:", event.data);
  ws.onerror = (error) => console.error("WebSocket Error:", error);

  ws.onclose = () => {
    console.log(`Disconnected. Retrying in ${reconnectInterval / 1000}s...`);
    reconnectTimer = setTimeout(connect, reconnectInterval);
    reconnectInterval = Math.min(reconnectInterval * 2, maxReconnectInterval);
    // Add some random jitter (e.g., +/- 10%) for better distribution
    reconnectInterval += (Math.random() - 0.5) * reconnectInterval * 0.2;
    reconnectInterval = Math.floor(reconnectInterval);
  };
}
connect();

Server-Side Disconnects

The server also needs to know when a client disconnects. This is crucial for cleaning up resources, updating connected user lists, or stopping data streams for that client.

Using a library like ws in Node.js, the WebSocket server emits a 'close' event on the individual client connection object when it disconnects.

Server Cleanup on Disconnect

Here's a basic Node.js WebSocket server example showing how to handle client disconnections and remove them from an active connections list.

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

let clients = new Set();

wss.on('connection', function connection(ws) {
  clients.add(ws);
  console.log('Client connected. Total:', clients.size);

  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.on('close', function close() {
    clients.delete(ws);
    console.log('Client disconnected. Total:', clients.size);
  });

  ws.send('Welcome!');
});

console.log('WebSocket server started on port 8080');

Check Your Understanding

Consider a client-side WebSocket application that needs to handle disconnections robustly.

Which of the following are good practices for implementing a reconnection strategy?

Recap: Robust Connections

We've explored how crucial it is to handle disconnections in realtime applications. Both client and server play a role in maintaining connection resilience.

  • Clients use onclose to detect disconnections.
  • Exponential backoff with jitter and a max delay prevents server overload during reconnections.
  • Servers use on('close') to clean up resources when clients leave.

These strategies ensure your realtime apps remain responsive and reliable, even in unstable network conditions.

Bezpłatny start

Ucz się WebSockets & Realtime Systems Programming dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
12
Lekcje
47

Często zadawane pytania

Czy lekcja „Obsługa rozłączeń i ponownych połączeń” jest bezpłatna?

Tak — pełny tekst „Obsługa rozłączeń i ponownych połączeń” 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 WebSockets & Realtime Systems Programming, przejdź na CoddyKit PRO. Kurs WebSockets & Realtime Systems Programming zawiera 4 lekcji w sumie.

Co nauczysz się w „Obsługa rozłączeń i ponownych połączeń”?

Zaimplementuj logikę po stronie klienta i serwera do wykrywania rozłączeń oraz automatycznego podejmowania prób ponownego połączenia. Ćwiczysz WebSockets & Realtime Systems Programming 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ąć WebSockets & Realtime Systems Programming?

Nie wymagamy żadnego doświadczenia. WebSockets & Realtime Systems Programming 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 1 z 4.

Ile czasu zajmuje lekcja „Obsługa rozłączeń i ponownych połączeń”?

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 WebSockets & Realtime Systems Programming?

Tak. Każda lekcja WebSockets & Realtime Systems Programming 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

  1. Obsługa rozłączeń i ponownych połączeń
  2. Solidne propagowanie błędów i odzyskiwanie po awariach
  3. Heartbeat i utrzymywanie połączeń
  4. Potwierdzanie wiadomości i gwarancje dostarczenia
← Powrót do WebSockets & Realtime Systems Programming