Next.js Advanced

WebSockets

Real-time features, Socket.io integration, server-sent events, and pub/sub.

Advertisement

WebSockets

Real-time features, Socket.io integration, server-sent events, and pub/sub.

Overview

Next.js supports real-time features through WebSockets and SSE.

Key Concepts

  • WebSocket API — Native browser WebSocket
  • Socket.io — Real-time library with fallbacks
  • Server-Sent Events — One-way server push
  • Pub/Sub Pattern — Message broadcasting
  • Custom Server — WebSocket support with custom server

Code Examples

// Custom server with WebSocket
// server.js
const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const { Server } = require('socket.io');

const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  const server = createServer((req, res) => {
    handle(req, res, parse(req.url, true));
  });

  const io = new Server(server);

  io.on('connection', (socket) => {
    console.log('Client connected');

    socket.on('message', (msg) => {
      io.emit('message', msg);
    });

    socket.on('disconnect', () => {
      console.log('Client disconnected');
    });
  });

  server.listen(3000);
});

// Client component
'use client';
import { useEffect, useState } from 'react';
import { io } from 'socket.io-client';

function Chat() {
  const [messages, setMessages] = useState([]);
  const [input, setInput] = useState('');
  const [socket, setSocket] = useState(null);

  useEffect(() => {
    const newSocket = io();
    setSocket(newSocket);

    newSocket.on('message', (msg) => {
      setMessages(prev => [...prev, msg]);
    });

    return () => newSocket.close();
  }, []);

  const sendMessage = () => {
    socket?.emit('message', input);
    setInput('');
  };

  return (
    <div>
      <div className="messages">
        {messages.map((msg, i) => <div key={i}>{msg}</div>)}
      </div>
      <input value={input} onChange={(e) => setInput(e.target.value)} />
      <button onClick={sendMessage}>Send</button>
    </div>
  );
}

Practice

Build a real-time chat application with Socket.io and Next.js.