Traditional HTTP requests require the browser to constantly poll the server for updates. For real-time applications—such as live multiplayer gaming, financial stock tickers, collaborative document editing, and chat platforms—WebSockets provide a persistent, two-way connection where the server can push updates instantly.
npm install express socket.io
// socketServer.js
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server, {
cors: { origin: '*' } // Allow cross-origin client connections
});
io.on('connection', (socket) => {
console.log(`[USER CONNECTED] Socket ID: ${socket.id}`);
// 1. Join a specific chat room
socket.on('joinRoom', (roomName) => {
socket.join(roomName);
console.log(`Socket ${socket.id} joined room: ${roomName}`);
// Notify room members
socket.to(roomName).emit('notification', `New student entered ${roomName}!`);
});
// 2. Handle incoming room message
socket.on('chatMessage', ({ room, user, message }) => {
console.log(`[${room}] ${user}: ${message}`);
// Broadcast message to everyone in room including sender
io.to(room).emit('newChatMessage', {
user,
message,
time: new Date().toLocaleTimeString()
});
});
// 3. Handle disconnect
socket.on('disconnect', () => {
console.log(`[USER DISCONNECTED] Socket ID: ${socket.id}`);
});
});
server.listen(3000, () => console.log('Socket.io server running on port 3000'));
Boost your server-side JavaScript proficiency by studying these closely connected core modules:
WebSockets handshake initiates via an HTTP Upgrade header.
Scale Socket.io across servers with the Redis Adapter.
Authenticate WebSocket connections during handshake.