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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- WebSocket API: เปิด รับข้อความ ปิด และข้อผิดพลาด
- การเชื่อมต่อ Socket.io ฝั่งไคลเอนต์
- เหตุการณ์จากเซิร์ฟเวอร์สำหรับการสตรีมทางเดียว
- รูปแบบ UI แบบเรียลไทม์