Bird
Raised Fist0
Node.jsframework~10 mins

ws library for WebSocket server in Node.js - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - ws library for WebSocket server
Start Node.js Server
↓
Create WebSocket Server
↓
Wait for Client Connection
↓
Client Connects?
No→Wait
Yes↓
Listen for Messages
↓
Receive Message
↓
Process & Respond
↓
Client Disconnects?
No→Listen for Messages
Yes↓
Close Connection
↓
Stop Server or Wait for New Clients
The server starts, creates a WebSocket server, waits for clients, handles messages, and manages connections.
Execution Sample
Node.js
import { WebSocketServer } from 'ws';

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', ws => {
  ws.on('message', message => {
    ws.send(`Echo: ${message}`);
  });
});
This code creates a WebSocket server on port 8080 that echoes back any message it receives from clients.
Execution Table
StepEventActionMessage ContentServer Response
1Server StartWebSocket server created on port 8080--
2Client ConnectsConnection event triggered--
3Client Sends MessageMessage event triggeredHello ServerEcho: Hello Server
4Client Sends MessageMessage event triggeredHow are you?Echo: How are you?
5Client DisconnectsClose event triggered--
6No More ClientsServer waits for new connections--
💡 Execution stops when server is closed or no clients remain connected.
Variable Tracker
VariableStartAfter Client ConnectAfter Message 1After Message 2After Disconnect
wss.clients.size01110
ws.readyStateN/AOPENOPENOPENCLOSED
lastMessageN/AN/A"Hello Server""How are you?"N/A
Key Moments - 3 Insights
Why does the server keep running even after a client disconnects?
Because the server listens for new connections continuously as shown in execution_table step 6, it does not stop when one client disconnects.
What happens if the client sends multiple messages quickly?
Each message triggers the 'message' event separately, and the server responds to each as shown in steps 3 and 4.
Why is ws.readyState 'OPEN' after connection but 'CLOSED' after disconnect?
The readyState reflects the connection status: 'OPEN' means connected and able to send/receive, 'CLOSED' means connection ended, as tracked in variable_tracker.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the server response when the client sends 'Hello Server'?
AEcho: Hello Server
BHello Server
CMessage received
DNo response
💡 Hint
Check execution_table row 3 under 'Server Response'
At which step does the client disconnect from the server?
AStep 2
BStep 3
CStep 5
DStep 6
💡 Hint
Look for 'Client Disconnects' event in execution_table
If a new client connects after step 5, how does wss.clients.size change?
ARemains 0
BChanges to 1
CChanges to 2
DChanges to -1
💡 Hint
Refer to variable_tracker for wss.clients.size changes after client connect
Concept Snapshot
ws library creates a WebSocket server with WebSocketServer({port}).
Listen for 'connection' events to handle clients.
Use ws.on('message') to receive messages.
Respond with ws.send().
Server runs continuously, handling multiple clients.
Close connections with ws.close().
Full Transcript
This visual execution trace shows how to create a WebSocket server using the ws library in Node.js. The server starts and listens on port 8080. When a client connects, the server triggers a connection event and listens for messages from that client. Each message received triggers a message event, and the server responds by sending back an echo of the message. When the client disconnects, the server triggers a close event but continues running to accept new clients. Variables like the number of connected clients and connection state update accordingly. This step-by-step flow helps beginners see how the server handles connections and messages in real time.

Practice

(1/5)
1. What is the main purpose of the ws library in Node.js?
easy
A. To connect to SQL databases
B. To create WebSocket servers and clients for real-time communication
C. To handle HTTP requests and routing
D. To manage file uploads in Node.js applications

Solution

  1. Step 1: Understand the role of ws

    The ws library is designed specifically for WebSocket communication, enabling real-time data exchange between server and client.
  2. Step 2: Compare with other options

    Options A, B, and C relate to other Node.js tasks like file uploads, HTTP routing, and database connections, which are not the focus of ws.
  3. Final Answer:

    To create WebSocket servers and clients for real-time communication -> Option B
  4. Quick Check:

    WebSocket library = real-time communication [OK]
Hint: Remember: ws = WebSocket server/client library [OK]
Common Mistakes:
  • Confusing ws with HTTP or database libraries
  • Thinking ws handles file uploads
  • Assuming ws manages REST API routing
2. Which of the following is the correct way to create a WebSocket server using the ws library?
easy
A. const server = new WebSocketServer({ port: 8080 });
B. const server = new WebSocket({ port: 8080 });
C. const server = new WebSocketServer.listen(8080);
D. const server = ws.createServer(8080);

Solution

  1. Step 1: Recall the correct constructor usage

    The ws library uses WebSocketServer constructor with an options object, including the port number.
  2. Step 2: Check each option's syntax

    const server = new WebSocketServer({ port: 8080 }); correctly uses new WebSocketServer({ port: 8080 }). Options B, C, and D use incorrect constructors or methods not defined in ws.
  3. Final Answer:

    const server = new WebSocketServer({ port: 8080 }); -> Option A
  4. Quick Check:

    Correct constructor syntax = const server = new WebSocketServer({ port: 8080 }); [OK]
Hint: Use new WebSocketServer({ port }) to create server [OK]
Common Mistakes:
  • Using WebSocket instead of WebSocketServer for server creation
  • Calling listen() method which does not exist
  • Using non-existent ws.createServer() method
3. What will the following code output when a client sends the message 'Hello' to the server?
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', ws => {
  ws.on('message', message => {
    console.log(`Received: ${message}`);
    ws.send('Hi client');
  });
});
medium
A. Nothing happens because no connection event is handled
B. Server logs 'Hi client' and sends 'Received: Hello' back
C. Server throws an error because message event is invalid
D. Server logs 'Received: Hello' and sends 'Hi client' back

Solution

  1. Step 1: Understand event handling

    The server listens for 'connection' events, then listens for 'message' events on each connection. When a message arrives, it logs the message and sends a reply.
  2. Step 2: Trace the message flow

    When client sends 'Hello', server logs 'Received: Hello' and sends 'Hi client' back to client.
  3. Final Answer:

    Server logs 'Received: Hello' and sends 'Hi client' back -> Option D
  4. Quick Check:

    Message event logs input and replies = Server logs 'Received: Hello' and sends 'Hi client' back [OK]
Hint: Message event logs input, ws.send replies [OK]
Common Mistakes:
  • Confusing message event with connection event
  • Thinking server sends back the received message
  • Assuming message event is invalid
4. Identify the error in this WebSocket server code snippet:
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 3000 });
wss.on('connection', function(ws) {
  ws.on('message', function(msg) {
    ws.send(msg.toUpperCase);
  });
});
medium
A. WebSocketServer should be imported from 'websocket' package
B. The 'connection' event should be 'connect'
C. Using msg.toUpperCase without parentheses causes a runtime error
D. ws.send cannot send strings, only buffers

Solution

  1. Step 1: Check method usage on message

    The code uses msg.toUpperCase without parentheses, so it passes the function itself instead of calling it.
  2. Step 2: Understand the impact

    This causes a runtime error because ws.send expects a string or buffer, not a function reference.
  3. Final Answer:

    Using msg.toUpperCase without parentheses causes a runtime error -> Option C
  4. Quick Check:

    Method call missing () causes error = Using msg.toUpperCase without parentheses causes a runtime error [OK]
Hint: Always call string methods with () to avoid errors [OK]
Common Mistakes:
  • Confusing event names 'connection' vs 'connect'
  • Importing WebSocketServer from wrong package
  • Thinking ws.send cannot send strings
5. You want to broadcast a message to all connected clients using the ws library. Which code snippet correctly sends 'Hello all!' to every client connected to the server?
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 8080 });

// Broadcast function here
function broadcast(message) {
  // ???
}
hard
A. wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) client.send(message); });
B. wss.clients.map(client => client.send(message));
C. wss.broadcast(message);
D. wss.send(message);

Solution

  1. Step 1: Understand how to access clients

    The wss.clients set contains all connected clients. We must iterate over it to send messages.
  2. Step 2: Check client connection state before sending

    Only clients with readyState === WebSocket.OPEN can receive messages safely.
  3. Step 3: Verify each option

    wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) client.send(message); }); correctly uses forEach and checks readyState. wss.clients.map(client => client.send(message)); uses map which is not appropriate here. Options A and D use non-existent methods.
  4. Final Answer:

    wss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) client.send(message); }); -> Option A
  5. Quick Check:

    Broadcast = forEach + readyState check [OK]
Hint: Use forEach and check readyState before sending [OK]
Common Mistakes:
  • Using map instead of forEach for side effects
  • Calling non-existent broadcast or send on server
  • Not checking client readyState before sending
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard