0Pricing
Frontend Academy · บทเรียน

WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด

สร้างการเชื่อมต่อ WebSocket ส่งและรับข้อความในตัวจัดการเหตุการณ์ message และจัดการข้อผิดพลาดของการเชื่อมต่อรวมถึงการปิดอย่างเรียบร้อย

WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

ทำไมต้องใช้ WebSockets

HTTP ใช้รูปแบบคำขอและการตอบกลับ สำหรับแอปแบบเรียลไทม์ เช่น แชต เกมผู้เล่นหลายคน และการอัปเดตแบบสด คุณต้องมีการสื่อสารสองทางที่คงอยู่ต่อเนื่อง WebSockets ให้การเชื่อมต่อ TCP เพียงช่องเดียวที่ยังเปิดอยู่ และทำให้ทั้งสองฝั่งส่งข้อความได้ทุกเมื่อ

การสร้าง WebSocket

สร้าง WebSocket ด้วย URL ที่ขึ้นต้นด้วย ws:// หรือ wss:// เบราว์เซอร์จะจัดการกระบวนการจับมือเพื่ออัปเกรดการเชื่อมต่อให้เอง

const ws = new WebSocket('wss://api.example.com/realtime');

// Always use wss:// (secure) in production

เหตุการณ์ทั้งสี่

WebSocket มีประเภทเหตุการณ์สี่ประเภท ได้แก่ open (เชื่อมต่อแล้ว), message (ได้รับข้อมูล), close (การเชื่อมต่อสิ้นสุดลง) และ error (เกิดปัญหา)

ws.addEventListener('open', () => {
  console.log('Connected');
  ws.send(JSON.stringify({ type: 'subscribe', channel: 'updates' }));
});

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

ws.addEventListener('close', (event) => {
  console.log('Closed:', event.code, event.reason);
});

ws.addEventListener('error', (event) => {
  console.error('Error:', event);
});

การส่งข้อความ

ใช้ ws.send() ซึ่งรับสตริง, ArrayBuffers, Blobs หรือ ArrayBufferView ได้ หากเป็นข้อมูลที่มีโครงสร้าง ให้เรียก JSON.stringify ก่อน

ws.send('hello');
ws.send(JSON.stringify({ type: 'chat', text: 'Hi' }));

// Binary:
const buffer = new ArrayBuffer(8);
ws.send(buffer);

การรับข้อความ

ตรวจสอบ event.data — ประเภทของข้อมูลจะตรงกับสิ่งที่เซิร์ฟเวอร์ส่งมา หากเป็นข้อมูลเพย์โหลดชนิดออบเจ็กต์ ให้ใช้ JSON.parse

ws.addEventListener('message', (event) => {
  // typeof event.data: string | ArrayBuffer | Blob
  if (typeof event.data === 'string') {
    const msg = JSON.parse(event.data);
    handleMessage(msg);
  }
});

สถานะการเชื่อมต่อ (readyState)

ตรวจสอบ ws.readyState: CONNECTING=0, OPEN=1, CLOSING=2 และ CLOSED=3 อย่าส่งข้อมูลก่อนสถานะจะเป็น OPEN

if (ws.readyState === WebSocket.OPEN) {
  ws.send(message);
} else {
  console.warn('Not connected yet');
}

การปิดการเชื่อมต่ออย่างเรียบร้อย

เรียก ws.close(code, reason) รหัสการปิดมาตรฐาน ได้แก่ 1000 (ปกติ), 1001 (กำลังออกจากระบบ), 1008 (ละเมิดนโยบาย) และ 1011 (เซิร์ฟเวอร์เกิดข้อผิดพลาด)

ws.close(1000, 'User logged out');

กลยุทธ์การเชื่อมต่อใหม่

WebSockets อาจตัดการเชื่อมต่อเมื่อเครือข่ายเปลี่ยนแปลง เซิร์ฟเวอร์เริ่มทำงานใหม่ และกรณีอื่น ๆ ให้ใช้การเชื่อมต่อใหม่แบบหน่วงเวลาเพิ่มขึ้นเป็นทวีคูณ

let reconnectDelay = 1000;

function connect() {
  const ws = new WebSocket('wss://api/realtime');
  ws.addEventListener('open', () => { reconnectDelay = 1000; });
  ws.addEventListener('close', () => {
    setTimeout(connect, reconnectDelay);
    reconnectDelay = Math.min(reconnectDelay * 2, 30000);
  });
  return ws;
}

สัญญาณชีพ / การรักษาการเชื่อมต่อ

WebSockets ที่ไม่มีการใช้งานอาจถูกพร็อกซีและตัวกระจายโหลดตัดการเชื่อมต่อหลังจากประมาณ 60 วินาที ให้ส่งสัญญาณ ping ทุก 25–30 วินาทีเพื่อรักษาการเชื่อมต่อไว้

let pingInterval;
ws.addEventListener('open', () => {
  pingInterval = setInterval(() => {
    if (ws.readyState === WebSocket.OPEN) {
      ws.send(JSON.stringify({ type: 'ping' }));
    }
  }, 25000);
});
ws.addEventListener('close', () => clearInterval(pingInterval));

การยืนยันตัวตน

WebSockets ไม่รองรับส่วนหัวแบบกำหนดเอง ตัวเลือกมีดังนี้: 1) ยืนยันตัวตนด้วยโทเค็นในสตริงคำค้น (?token=jwt) ของ URL WS 2) ส่งข้อความยืนยันตัวตนหลังจาก open 3) ใช้คุกกี้ ซึ่งจะทำงานโดยอัตโนมัติเมื่อเป็นต้นทางเดียวกัน

// Query string:
const ws = new WebSocket(`wss://api/realtime?token=${jwt}`);

// Auth message:
ws.addEventListener('open', () => {
  ws.send(JSON.stringify({ type: 'auth', token: jwt }));
});

ฮุก React สำหรับ WebSockets

ห่อหุ้มวงจรการทำงานของ WS ไว้ในฮุกแบบกำหนดเอง เพื่อป้องกันการรั่วไหลของการเชื่อมต่อ

function useWebSocket(url) {
  const [messages, setMessages] = useState([]);
  const wsRef = useRef(null);

  useEffect(() => {
    const ws = new WebSocket(url);
    wsRef.current = ws;
    ws.addEventListener('message', (e) => {
      setMessages(m => [...m, JSON.parse(e.data)]);
    });
    return () => ws.close();
  }, [url]);

  return { messages, send: (msg) => wsRef.current?.send(JSON.stringify(msg)) };
}

WebSocket เทียบกับ HTTP/2 และ SSE

WebSocket: สื่อสารได้สองทิศทางเต็มรูปแบบ ทั้งสองฝั่งส่งข้อมูลได้ การส่งข้อมูลจากเซิร์ฟเวอร์ด้วย HTTP/2: เลิกใช้แล้ว Server-Sent Events: ส่งได้จากเซิร์ฟเวอร์ไปยังไคลเอ็นต์เท่านั้น เรียบง่ายกว่าและเชื่อมต่อใหม่โดยอัตโนมัติ เลือก WS เมื่อไคลเอ็นต์ต้องส่งข้อมูลด้วย เช่น แชต และเลือก SSE สำหรับการแจ้งเตือนทางเดียว

ตรวจสอบความเข้าใจ

รหัสการปิด WebSocket มาตรฐานสำหรับการปิดตามปกติโดยตั้งใจ เช่น เมื่อผู้ใช้ออกจากระบบ คือรหัสใด

สรุป: WebSocket API

new WebSocket('wss://...') จะเปิดการเชื่อมต่อ มีเหตุการณ์สี่ประเภท ได้แก่ open, message, close และ error เมธอด send() รับสตริง/ArrayBuffer/Blob ได้ และใช้ JSON.stringify กับออบเจ็กต์ ตรวจสอบ readyState ก่อนส่งข้อมูล ใช้ close(1000) เพื่อปิดการเชื่อมต่ออย่างเรียบร้อย เชื่อมต่อใหม่ด้วยการหน่วงเวลาเพิ่มขึ้นเป็นทวีคูณ ส่งสัญญาณชีพทุก 25 วินาทีเพื่อรักษาการเชื่อมต่อ ใช้สตริงคำค้นหรือข้อความยืนยันตัวตนเพื่อยืนยันตัวตน และห่อหุ้มทั้งหมดไว้ในฮุกสำหรับ React

คำถามที่พบบ่อย

บทเรียน “WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด”

สร้างการเชื่อมต่อ WebSocket ส่งและรับข้อความในตัวจัดการเหตุการณ์ message และจัดการข้อผิดพลาดของการเชื่อมต่อรวมถึงการปิดอย่างเรียบร้อย คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม

ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด
  2. การเชื่อมต่อ Socket.io ฝั่งไคลเอนต์
  3. เหตุการณ์จากเซิร์ฟเวอร์สำหรับการสตรีมทางเดียว
  4. รูปแบบ UI แบบเรียลไทม์
← กลับไปที่ Frontend Academy