Claude Code WebSocket & Realtime Apps: Socket.io und SSE 2026

Realtime-Funktionalität ist eines der schwierigsten Themen in der Web-Entwicklung: Verbindungsmanagement, Reconnection-Logic, State-Synchronisation, Skalierung auf mehrere Server. Claude Code kennt die bewährten Patterns und generiert produktionsreifen Code.

WebSocket vs. Server-Sent Events vs. Long Polling

Technologie Richtung Use Case Wann nutzen
WebSocket Bidirektional Chat, Spiele, Kollaboration Client sendet UND empfängt
Server-Sent Events Server → Client Live-Feeds, Notifications, Dashboards Nur Server sendet Updates
Long Polling Client fragt Legacy-Systeme Nur wenn WebSocket/SSE nicht geht
Faustregel: Chat, Multiplayer, Collaborative Editing → WebSocket. Notifications, Live-Daten, KI-Streaming → Server-Sent Events. SSE ist einfacher, braucht keinen Upgrade-Handshake und funktioniert durch alle HTTP/2-Proxies.

WebSocket-Server mit Socket.io

WebSocketChat-App Basis

# Claude Code Prompt: # "Erstelle einen Socket.io Chat-Server mit: # - Rooms (Kanäle), User-Presence (online/offline) # - Typing-Indicators, Read-Receipts # - Message-Persistierung in Redis (letzte 100 Messages pro Room) # - Auth via JWT beim Connect" const { Server } = require('socket.io'); const jwt = require('jsonwebtoken'); const redis = require('ioredis'); const io = new Server(httpServer, { cors: { origin: process.env.FRONTEND_URL, credentials: true } }); // Auth Middleware io.use(async (socket, next) => { try { const token = socket.handshake.auth.token; socket.user = jwt.verify(token, process.env.JWT_SECRET); next(); } catch { next(new Error('Unauthorized')); } }); io.on('connection', (socket) => { const { userId, name } = socket.user; console.log(`${name} connected`); // User Presence await redis.sadd('online_users', userId); socket.broadcast.emit('user:online', { userId, name }); socket.on('room:join', async (roomId) => { socket.join(roomId); // Letzte 100 Messages aus Redis laden const history = await redis.lrange(`room:${roomId}:messages`, -100, -1); socket.emit('room:history', history.map(JSON.parse)); }); socket.on('message:send', async ({ roomId, content }) => { const message = { id: crypto.randomUUID(), userId, name, content, timestamp: Date.now() }; // In Redis persistieren + an Room broadcasten await redis.rpush(`room:${roomId}:messages`, JSON.stringify(message)); await redis.ltrim(`room:${roomId}:messages`, -100, -1); io.to(roomId).emit('message:new', message); }); socket.on('typing:start', ({ roomId }) => { socket.to(roomId).emit('typing:start', { userId, name }); }); socket.on('disconnect', async () => { await redis.srem('online_users', userId); socket.broadcast.emit('user:offline', { userId }); }); });

Server-Sent Events für KI-Streaming

SSEClaude API Streaming-Antworten

SSE ist perfekt für KI-Streaming: der Server sendet Token für Token, der Client zeigt sie live an.

# Server-Side (Express) app.get('/api/ai/stream', async (req, res) => { const { prompt } = req.query; // SSE Headers res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); const stream = claude.messages.stream({ model: 'claude-haiku-4-5', max_tokens: 1024, messages: [{ role: 'user', content: prompt }] }); for await (const event of stream) { if (event.type === 'content_block_delta') { res.write(`data: ${JSON.stringify({ text: event.delta.text })}\n\n`); } } res.write('data: [DONE]\n\n'); res.end(); }); # Client-Side (Browser) const eventSource = new EventSource(`/api/ai/stream?prompt=${encodeURIComponent(prompt)}`); let fullText = ''; eventSource.onmessage = (e) => { if (e.data === '[DONE]') { eventSource.close(); return; } fullText += JSON.parse(e.data).text; document.getElementById('output').textContent = fullText; };

Reconnection Logic

# Robuste Reconnection-Logic (Socket.io Client) const socket = io('https://api.example.com', { auth: { token: localStorage.getItem('jwt') }, reconnection: true, reconnectionDelay: 1000, reconnectionDelayMax: 30000, // Max 30s zwischen Versuchen reconnectionAttempts: 10 }); socket.on('connect', () => { console.log('Connected'); // Verpasste Events seit Reconnect nachladen if (lastEventId) { socket.emit('sync:missed', { since: lastEventId }); } }); socket.on('reconnect_attempt', (attempt) => { // Token erneuern falls abgelaufen socket.auth.token = localStorage.getItem('jwt'); console.log(`Reconnect attempt ${attempt}`); }); socket.on('connect_error', (error) => { if (error.message === 'Unauthorized') { // Token ungültig → User ausloggen handleLogout(); } });

Skalierung: Socket.io mit Redis Adapter

# Mehrere Server: Redis Adapter synchronisiert Rooms const { createAdapter } = require('@socket.io/redis-adapter'); const pubClient = new Redis(process.env.REDIS_URL); const subClient = pubClient.duplicate(); io.adapter(createAdapter(pubClient, subClient)); # Jetzt können 3 App-Server denselben Room bedienen # io.to('room-123').emit() geht automatisch an alle Server

Realtime-Modul im Kurs

Im Claude Code Mastery Kurs gibt es ein Realtime-Modul: vollständige Chat-App mit Socket.io, KI-Streaming mit SSE, Presence-System und horizontale Skalierung mit Redis Adapter — komplett mit Code.

14 Tage kostenlos testen →