Chapter 7: Real-time Applications with Socket.io
Chapter 7 of 15
Chapter 7: Real-time Applications with Socket.io
7.1 WebSockets
Socket.io enables real-time, bidirectional communication between client and server using WebSockets with fallback options.
// Server setup
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);
io.on('connection', (socket) => {
console.log('User connected:', socket.id);
socket.on('disconnect', () => {
console.log('User disconnected:', socket.id);
});
socket.on('message', (data) => {
io.emit('message', data); // Broadcast to all
});
});
server.listen(3000);
7.2 Rooms and Namespaces
// Rooms - Group sockets
io.on('connection', (socket) => {
socket.join('room1');
// Send to specific room
io.to('room1').emit('message', 'Hello room');
// Leave room
socket.leave('room1');
});
// Namespaces
const adminNamespace = io.of('/admin');
adminNamespace.on('connection', (socket) => {
console.log('Admin connected');
});
7.3 Client Implementation
// Client-side
import io from 'socket.io-client';
const socket = io('http://localhost:3000');
socket.on('connect', () => {
console.log('Connected to server');
});
socket.on('message', (data) => {
console.log('Received:', data);
});
socket.emit('message', { text: 'Hello server' });
7.4 Scaling Socket.io
// Using Redis adapter for multiple servers
const { createAdapter } = require('@socket.io/redis-adapter');
const { createClient } = require('redis');
const pubClient = createClient({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
io.adapter(createAdapter(pubClient, subClient));