WebSocket is a protocol that enables two-way, persistent communication channels over a single TCP connection. Unlike HTTP, which follows a request-response model, WebSocket allows both the server and client to send messages to each other independently. This makes it perfect for real-time applications like chat systems, online games, collaborative editing tools, and live dashboards.
To create a WebSocket server in Node.js, we will use the popular ws package, which is a simple and efficient WebSocket implementation.
npm init -y
npm install ws
Below is a minimal example of a WebSocket server using the ws package.
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
console.log('Client connected');
ws.on('message', function incoming(message) {
console.log('Received:', message);
ws.send('Server received: ' + message);
});
ws.on('close', function close() {
console.log('Client disconnected');
});
});
console.log('WebSocket server is running on ws://localhost:8080');
The WebSocket.Server instance keeps track of all clients connected to the server. You can broadcast messages to all clients using the wss.clients set.
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send('Broadcast: ' + message);
}
});
});
});
To test the server, you can create a simple HTML client that connects to the WebSocket server.
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Client</title>
</head>
<body>
<h1>WebSocket Client</h1>
<input id="messageInput" placeholder="Type a message" />
<button onclick="sendMessage()">Send</button>
<div id="messages"></div>
<script>
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
console.log('Connected to server');
};
socket.onmessage = (event) => {
const messages = document.getElementById('messages');
const newMessage = document.createElement('p');
newMessage.textContent = event.data;
messages.appendChild(newMessage);
};
function sendMessage() {
const input = document.getElementById('messageInput');
socket.send(input.value);
input.value = '';
}
</script>
</body>
</html>
wss.on('error', function error(err) {
console.error('WebSocket server error:', err);
});
socket.onerror = function(event) {
console.error('WebSocket error:', event);
};
For production environments, it's recommended to use secure WebSocket connections (wss), which are encrypted via TLS/SSL.
const fs = require('fs');
const https = require('https');
const WebSocket = require('ws');
const server = https.createServer({
cert: fs.readFileSync('path/to/cert.pem'),
key: fs.readFileSync('path/to/key.pem')
});
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(ws) {
ws.on('message', function(message) {
ws.send('Secure Echo: ' + message);
});
});
server.listen(8443);
Building a WebSocket server with Node.js and the ws library is straightforward and powerful. WebSockets allow real-time, two-way communication with minimal overhead, making them ideal for modern applications that demand low latency and high interactivity. As your application scales, you can integrate WebSocket with load balancers, Redis pub/sub, and message queues to build robust and scalable real-time systems.
A function passed as an argument and executed later.
Runs multiple instances to utilize multi-core systems.
Reusable blocks of code, exported and imported using require() or import.
nextTick() executes before setImmediate() in the event loop.
Starts a server and listens on specified port.
Node Package Manager β installs, manages, and shares JavaScript packages.
A minimal and flexible web application framework for Node.js.
A stream handles reading or writing data continuously.
It processes asynchronous callbacks and non-blocking I/O operations efficiently.
Node.js is a JavaScript runtime built on Chrome's V8 engine for server-side scripting.
An object representing the eventual completion or failure of an asynchronous operation.
require is CommonJS; import is ES6 syntax (requires transpilation or newer versions).
Use module.exports or exports.functionName.
Variables stored outside the code for configuration, accessed using process.env.
MongoDB, often used with Mongoose for schema management.
Describes project details and manages dependencies and scripts.
Synchronous blocks execution; asynchronous runs in background without blocking.
Allows or restricts resources shared between different origins.
Use try-catch, error events, or middleware for error handling.
Provides file system-related operations like read, write, delete.
Using event-driven architecture and non-blocking I/O.
Functions in Express that execute during request-response cycle.
A set of routes or endpoints to interact with server logic or databases.
Yes, it's single-threaded but handles concurrency using the event loop and asynchronous callbacks.
Middleware to parse incoming request bodies, like JSON or form data.
Copyrights © 2024 letsupdateskills All rights reserved