Advanced Node.js

Master advanced Node.js concepts including microservices, performance optimization, and production deployment.

advanced Backend Development 7 hours

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));