Plain HTTP is request/response: the client asks, the server answers, done. That's a poor fit for real-time features (chat, live dashboards, notifications, collaborative editing) where the server needs to push data whenever it has something new. The options are ways to get around HTTP's client-initiated model, along a spectrum of complexity:
Long-polling client ──req──▶ server ...holds... ──resp──▶ then immediately re-asks
(near-real-time over plain HTTP; one message per held request)
SSE client ──req──▶ server ═══stream of events═══▶ (one-way, server→client)
(HTTP-based, text, auto-reconnect; NO client→server on same channel)
WebSocket client ──handshake──▶ server ══full-duplex, both directions══▶
(persistent TCP; low overhead; binary or text; you build the rest)
