Connection Lifecycle and States
Explore the various states of a WebSocket connection, from opening to closing, and how to manage them.
Connection Lifecycle and States is a free WebSockets & Realtime Systems Programming lesson on CoddyKit — lesson 3 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the WebSockets & Realtime Systems Programming learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Understanding Connection States
When you work with WebSockets, it's crucial to know the current state of your connection. This helps you manage data flow and handle disconnections gracefully.
Just like a phone call goes through phases (dialing, connected, hanging up), a WebSocket connection has a defined lifecycle with specific states.
The CONNECTING State (0)
The very first state of a WebSocket is CONNECTING. This happens immediately after you create a new WebSocket object.
- Its numeric value is
0. - In this state, the client is trying to establish a connection with the server.
- This includes the initial HTTP handshake process that upgrades the connection to WebSocket.
- You cannot send messages yet.
Connecting with Node.js
When a WebSocket client attempts to connect, it enters the CONNECTING state (readyState = 0). This is where the initial handshake occurs.
To run this Node.js example:
- Make sure you have Node.js installed.
- Open your terminal and run
npm init -y - Install the
wslibrary:npm install ws - Save the code below as
index.js. - Run
node index.js.
Note: You'll need a WebSocket server running on ws://localhost:8080 for a successful connection.
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');
console.log(`Initial state: ${ws.readyState}`); // Expected: 0 (CONNECTING)
ws.onopen = () => {
console.log(`Connection opened! State: ${ws.readyState}`); // Expected: 1 (OPEN)
ws.send('Hello from CoddyKit client!');
setTimeout(() => ws.close(1000, 'Demo complete'), 2000);
};
ws.onmessage = (event) => {
console.log(`Received: ${event.data}`);
};
ws.onclose = (event) => {
console.log(`Connection closed. Code: ${event.code}, Reason: ${event.reason}`);
console.log(`Final state: ${ws.readyState}`); // Expected: 3 (CLOSED)
};
ws.onerror = (error) => {
console.error('WebSocket Error:', error.message);
};The OPEN State (1)
Once the handshake is complete and the connection is successfully established, the WebSocket enters the OPEN state.
- Its numeric value is
1. - In this state, the connection is ready for bidirectional communication.
- You can send data to the server, and the server can send data to you.
- This is the active communication phase.
Handling the OPEN Event
The onopen event is fired once the WebSocket connection transitions from CONNECTING to OPEN. This is your cue that you can start sending messages.
Run this Node.js example to see the onopen event in action:
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => {
console.log('WebSocket connection is now OPEN!');
console.log(`Current state: ${ws.readyState}`); // Expected: 1 (OPEN)
ws.send('Ready to chat!');
setTimeout(() => ws.close(), 1500); // Close after a short delay
};
ws.onmessage = (event) => {
console.log('Received:', event.data);
};
ws.onclose = () => {
console.log('Connection closed.');
};
ws.onerror = (error) => {
console.error('Error:', error.message);
};The CLOSING State (2)
When either the client or the server decides to terminate the connection, it enters the CLOSING state.
- Its numeric value is
2. - This state occurs after
ws.close()is called, but before the connection is fully shut down. - During this phase, a closing handshake is performed to ensure a clean termination.
- No new messages should be sent, though some buffered messages might still be processed.
Gracefully Closing a Connection
You can explicitly close a WebSocket connection using the ws.close() method. This will transition the connection through the CLOSING state (readyState = 2) before finally becoming CLOSED (readyState = 3).
Observe the state changes when closing:
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => {
console.log(`Connection OPEN. State: ${ws.readyState}`); // 1
console.log('Initiating connection close...');
ws.close(1000, 'Client requested shutdown'); // Code 1000: normal closure
console.log(`State after calling close(): ${ws.readyState}`); // Expected: 2 (CLOSING)
};
ws.onclose = (event) => {
console.log(`Connection CLOSED. State: ${ws.readyState}`); // 3
console.log(`Close Code: ${event.code}, Reason: ${event.reason}`);
};
ws.onerror = (error) => {
console.error('Error during connection:', error.message);
};The CLOSED State (3)
The final state for a WebSocket connection is CLOSED.
- Its numeric value is
3. - The connection has been completely terminated.
- No further communication can occur on this particular WebSocket object.
- If you need to reconnect, you must create a new
WebSocketinstance.
Checking Connection Status
You can always check the current state of a WebSocket connection using its readyState property. This property returns one of the numeric values (0, 1, 2, 3) or their corresponding named constants:
WebSocket.CONNECTING(0)WebSocket.OPEN(1)WebSocket.CLOSING(2)WebSocket.CLOSED(3)
Using these constants makes your code more readable!
Quick Check: Connection States
The readyState property indicates the current status of a WebSocket connection.
Recap: WebSocket Lifecycle
Great job! You've learned about the four essential states of a WebSocket connection:
CONNECTING(0): Handshake in progress.OPEN(1): Connection established, ready for data.CLOSING(2): Close handshake initiated.CLOSED(3): Connection terminated.
Understanding these states is fundamental for building robust and reliable realtime applications.
Frequently asked questions
Is the “Connection Lifecycle and States” lesson free?
Yes — the full text of “Connection Lifecycle and States” is free to read here on the web, and the WebSockets & Realtime Systems Programming course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the WebSockets & Realtime Systems Programming course, upgrade to CoddyKit PRO.
What will I learn in “Connection Lifecycle and States”?
Explore the various states of a WebSocket connection, from opening to closing, and how to manage them. You practise WebSockets & Realtime Systems Programming with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start WebSockets & Realtime Systems Programming?
No prior experience is required. WebSockets & Realtime Systems Programming on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Connection Lifecycle and States” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this WebSockets & Realtime Systems Programming lesson?
Yes. Every WebSockets & Realtime Systems Programming lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- The WebSocket Handshake Explained
- WebSocket Data Framing and Messages
- Connection Lifecycle and States
- Subprotocols, Extensions, and Compression