WebSocket Fundamentals — Realtime

WebSocket Fundamentals WebSocket membuat koneksi persistent, full-duplex antara client dan server. Setelah handshake HTTP awal, komunikasi dua arah via single T

WebSocket Fundamentals

WebSocket membuat koneksi persistent, full-duplex antara client dan server. Setelah handshake HTTP awal, komunikasi dua arah via single TCP connection.

Handshake

// Client request upgrade
GET /ws HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

// Server accepts
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

// Setelah ini: WebSocket protocol, bukan HTTP lagi

Server (Node.js with ws)

import { WebSocketServer } from "ws";

const wss = new WebSocketServer({ port: 8080 });

wss.on("connection", (ws) => {
  console.log("Client connected");

  ws.on("message", (data) => {
    const message = JSON.parse(data);
    console.log("Received:", message);

    // Echo back
    ws.send(JSON.stringify({ type: "echo", data: message }));
  });

  ws.on("close", () => {
    console.log("Client disconnected");
  });

  // Send welcome message
  ws.send(JSON.stringify({ type: "welcome", message: "Connected!" }));
});

Client (Browser)

const ws = new WebSocket("ws://localhost:8080");

ws.addEventListener("open", () => {
  console.log("Connected!");
  ws.send(JSON.stringify({ type: "hello", name: "Budi" }));
});

ws.addEventListener("message", (event) => {
  const data = JSON.parse(event.data);
  console.log("Server says:", data);
});

ws.addEventListener("close", (event) => {
  console.log("Disconnected:", event.code, event.reason);
  // Reconnect logic here
});

ws.addEventListener("error", (error) => {
  console.error("WebSocket error:", error);
});

Message Protocol

// Define message format
interface WSMessage {
  type: string;    // "chat", "typing", "join", "leave"
  payload: unknown; // message-specific data
  timestamp: number;
}

// Example messages
{ type: "chat", payload: { text: "Hello!" }, timestamp: 1234567890 }
{ type: "typing", payload: { userId: "123" }, timestamp: 1234567891 }

Yang akan kamu pelajari