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

การเชื่อมต่อ Socket.io ฝั่งไคลเอนต์

เชื่อมต่อไคลเอนต์ Socket.io รับฟังเหตุการณ์ที่ตั้งชื่อ ส่งข้อมูลไปยังเซิร์ฟเวอร์ จัดการการเชื่อมต่อใหม่ และจัดการห้องจากฝั่งไคลเอนต์

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

Socket.io เพิ่มอะไรจาก WebSocket แบบพื้นฐาน

Socket.io เป็นไลบรารียอดนิยมที่ทำงานอยู่บน WebSocket โดยเพิ่มความสามารถดังนี้: การเชื่อมต่อใหม่โดยอัตโนมัติ การเปลี่ยนไปใช้การโพลแบบต่อเนื่องเป็นทางเลือกสำรอง ห้องและเนมสเปซ ฟังก์ชันเรียกกลับเพื่อยืนยันการรับข้อความ และเหตุการณ์ที่ตั้งชื่อได้ ใช้ไลบรารีฝั่งไคลเอ็นต์ทำงานคู่กับไลบรารีฝั่งเซิร์ฟเวอร์ (Node.js)

การติดตั้งไคลเอ็นต์

ติดตั้ง socket.io-client โดยเวอร์ชันหลักต้องตรงกับของเซิร์ฟเวอร์

npm install socket.io-client

การเชื่อมต่อ

นำเข้า io แล้วเชื่อมต่อไปยัง URL ของเซิร์ฟเวอร์ ระบบจะแสดงอินสแตนซ์ Socket กลับมา

import { io } from 'socket.io-client';

const socket = io('https://api.example.com', {
  transports: ['websocket'], // skip polling fallback for speed
  auth: { token: localStorage.getItem('jwt') }
});

socket.on('connect', () => console.log('connected', socket.id));

การส่งเหตุการณ์

socket.emit(eventName, payload) จะส่งเหตุการณ์ที่มีชื่อพร้อมข้อมูล ซึ่งสะอาดกว่าการใช้ send แบบพื้นฐานร่วมกับ JSON.parse มาก

socket.emit('chat-message', {
  room: 'general',
  text: 'Hello everyone!'
});

socket.emit('typing', { user: 'Alice' });

การรับฟังเหตุการณ์

socket.on(eventName, handler) จะลงทะเบียนตัวรับฟัง เหตุการณ์ที่เซิร์ฟเวอร์ส่งมาจะมาถึงที่นี่

socket.on('chat-message', (msg) => {
  console.log(`${msg.user}: ${msg.text}`);
  appendMessage(msg);
});

socket.on('user-joined', (user) => {
  console.log(`${user.name} joined`);
});

การยืนยันการรับข้อความ (ฟังก์ชันเรียกกลับ Ack)

ส่งฟังก์ชันเรียกกลับเป็นอาร์กิวเมนต์สุดท้ายของ emit แล้วเซิร์ฟเวอร์จะเรียกฟังก์ชันนั้นพร้อมการตอบกลับได้ ลักษณะคล้าย RPC

socket.emit('create-post', { title: 'Hello' }, (response) => {
  if (response.error) {
    console.error(response.error);
  } else {
    console.log('Created post', response.id);
  }
});

emitWithAck ที่ทำงานด้วย Promise

Socket.io รุ่นใหม่มี emitWithAck ซึ่งส่งคืน promise

try {
  const response = await socket.emitWithAck('create-post', { title: 'Hello' });
  console.log('Created', response.id);
} catch (err) {
  console.error('Failed', err);
}

ห้อง

ห้องคือการจัดกลุ่มซ็อกเก็ตที่ฝั่งเซิร์ฟเวอร์ ไคลเอ็นต์จะเข้าหรือออกจากห้องด้วยการส่งเหตุการณ์ ส่วนเซิร์ฟเวอร์ใช้ io.to(room).emit() เพื่อกระจายข้อความ

// Client:
socket.emit('join-room', { roomId: 'general' });

// Listen to messages in any room you've joined:
socket.on('room-message', ({ room, message }) => {
  if (room === activeRoom) appendMessage(message);
});

// Leave:
socket.emit('leave-room', { roomId: 'general' });

เนมสเปซ

เนมสเปซคือช่องทางการสื่อสารแยกกันบนเซิร์ฟเวอร์เดียวกัน เช่น /chat และ /admin ให้เชื่อมต่อไปยังเนมสเปซโดยเติมส่วนต่อท้ายใน URL

const chatSocket = io('https://api/chat');
const adminSocket = io('https://api/admin');

มีการเชื่อมต่อใหม่ในตัว

Socket.io จะเชื่อมต่อใหม่โดยอัตโนมัติด้วยการหน่วงเวลาเพิ่มขึ้นเป็นทวีคูณ คุณกำหนดค่าได้ผ่านตัวเลือกต่าง ๆ

const socket = io({
  reconnection: true,
  reconnectionAttempts: Infinity,
  reconnectionDelay: 1000,
  reconnectionDelayMax: 30000,
  randomizationFactor: 0.5
});

socket.on('reconnect', (attempt) => console.log('reconnected after', attempt));
socket.on('reconnect_attempt', (attempt) => console.log('trying...', attempt));

การจัดการเมื่อถูกตัดการเชื่อมต่อ

รับฟังเหตุการณ์การตัดการเชื่อมต่อเพื่ออัปเดตส่วนติดต่อผู้ใช้ เช่น แสดงแบนเนอร์ว่า 'กำลังเชื่อมต่อใหม่...'

socket.on('disconnect', (reason) => {
  console.log('Disconnected:', reason);
  if (reason === 'io server disconnect') {
    // Server kicked us — must reconnect manually
    socket.connect();
  }
});

การผสานรวมกับ React

ห่อหุ้มวงจรการทำงานของซ็อกเก็ตไว้ในฮุกแบบกำหนดเองหรือผู้ให้บริการ Context

// useSocket.ts
import { useEffect, useState } from 'react';
import { io, Socket } from 'socket.io-client';

let socket: Socket;

export function useSocket() {
  const [connected, setConnected] = useState(false);
  useEffect(() => {
    if (!socket) socket = io('/');
    socket.on('connect', () => setConnected(true));
    socket.on('disconnect', () => setConnected(false));
    return () => { /* keep socket alive across remounts */ };
  }, []);
  return { socket, connected };
}

ควรใช้ Socket.io หรือ WebSocket แบบพื้นฐานเมื่อใด

Socket.io: เมื่อคุณต้องการห้อง ฟังก์ชันเรียกกลับเพื่อยืนยันการรับข้อความ การเชื่อมต่อใหม่โดยอัตโนมัติ และการเปลี่ยนวิธีขนส่งเป็นทางเลือกสำรองที่มีให้พร้อมใช้ WebSocket แบบพื้นฐาน: เมื่อคุณต้องควบคุมโปรโตคอลโดยตรง ต้องการขนาดชุดโปรแกรมที่เล็กที่สุด หรือต้องทำงานร่วมกับเซิร์ฟเวอร์ที่ไม่ใช่ Socket.io

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

ฟังก์ชันเรียกกลับในอาร์กิวเมนต์ลำดับที่สามของ emit(event, payload, callback) ของ Socket.io ทำให้ทำอะไรได้

สรุป: ไคลเอ็นต์ Socket.io

ไลบรารีที่ทำงานอยู่บน WebSocket พร้อมห้อง เนมสเปซ การยืนยันการรับข้อความ การเชื่อมต่อใหม่โดยอัตโนมัติ และการโพลเป็นทางเลือกสำรอง io(url, options) ใช้เชื่อมต่อ emit(event, payload) ใช้ส่งเหตุการณ์ที่มีชื่อ ส่วน on(event, handler) ใช้รับฟังเหตุการณ์ ใช้ฟังก์ชันเรียกกลับในอาร์กิวเมนต์ที่สามหรือ emitWithAck สำหรับการทำงานแบบ RPC ห้องจัดการผ่านเซิร์ฟเวอร์ และเนมสเปซกำหนดด้วยส่วนต่อท้ายของ URL การเชื่อมต่อใหม่มีมาให้ในตัว ห่อหุ้มไว้ในฮุก React เพื่อจัดการวงจรการทำงาน

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

บทเรียน “การเชื่อมต่อ Socket.io ฝั่งไคลเอนต์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมต่อ Socket.io ฝั่งไคลเอนต์”

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

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

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

บทเรียน “การเชื่อมต่อ Socket.io ฝั่งไคลเอนต์” ใช้เวลานานแค่ไหน

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

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

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

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

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