Giới thiệu
Socket.IO là một thư viện được xây dựng trên giao thức WebSocket và bổ sung các tính năng thân thiện với nhà phát triển mà không có sẵn trên WebSocket thuần túy. Khi xây dựng các tính năng thời gian thực như ứng dụng trò chuyện, trình soạn thảo hợp tác hoặc bảng điều khiển trực tiếp, bạn thường cần nhóm khách hàng một cách hợp lý, cô lập các kênh liên lạc và xử lý các kết nối bị ngắt một cách mềm mại. Socket.IO cung cấp sẵn các rooms, namespaces, tự động kết nối lại và fallback transport, vì vậy bạn không phải tự thiết kế chúng từ đầu.
Bài học này đi qua từng tính năng bốn tính năng này bằng mã ví dụ cụ thể. Cuối bài bạn sẽ biết cách phân khối máy chủ của bạn thành các namespaces, nhóm động các socket vào rooms, cho phép khách hàng tự động kết nối lại và dựa vào HTTP long-polling như một biện pháp an toàn khi WebSockets bị chặn.
Namespaces
Một namespace là một kênh liên lạc riêng biệt có chung kết nối TCP nền. Namespace mặc định là `/`, nhưng bạn có thể tạo các namespace tùy ý để phân tách các mối quan tâm một cách logic — ví dụ một kênh trò chuyện công khai so với bảng điều khiển quản trị.
Ở máy chủ:
Ở client:
Bất kỳ dữ liệu nào được gửi qua namespace `/admin` sẽ được cách ly khỏi namespace `/` mặc định, ngay cả khi cả hai cùng chạy trên cùng một máy chủ và cổng.
Rooms
Phòng là các kênh con bên trong một namespace. Một socket có thể tham gia hoặc rời khỏi một phòng bất cứ lúc nào, và máy chủ có thể phát tới mọi socket trong một phòng bằng một lời gọi duy nhất. Đây là mẫu bạn muốn cho nhắn tin theo cuộc trò chuyện trong một ứng dụng chat hoặc trạng thái trò chơi theo phòng trong một trò chơi nhiều người chơi.
`socket.join(roomId)` thêm socket vào một tập trong bộ nhớ được Socket.IO duy trì. `io.to(roomId).emit(...)` sau đó phân phối payload tới mọi thành viên của phòng đó. Socket tham gia tự bản thân không nhận được tin nhắn được gửi bằng `socket.to(...)` — hãy dùng điều này khi bạn muốn thông báo cho "mọi người khác" trong phòng.
Tự động kết nối lại và fallback giao thức
Raw WebSockets dừng hoạt động vĩnh viễn ngay khi mạng bị ngắt. client của Socket.IO sẽ tự động xử lý kết nối lại. Bạn có thể cấu hình chiến lược thử lại và thông báo cho người dùng những gì đang diễn ra thông qua các sự kiện.
Fallback giao thức là nửa còn lại của tính phục hồi. Socket.IO luôn thử WebSocket trước vì đây là lựa chọn có độ trễ thấp nhất, nhưng nếu handshake thất bại — firewall công ty, proxies cũ, mạng hạn chế — nó sẽ lặng lẽ chuyển sang HTTP long-polling. Mã ứng dụng không đổi; các gọi `emit` và `on` của bạn hoạt động tương tự trên cả hai giao thức.
Những sai lầm phổ biến và Tóm tắt
Hai sai lầm thường gặp. Thứ nhất, đừng lưu membership của phòng trong biến của riêng bạn — luôn tin tưởng `socket.rooms` trả về từ Socket.IO, bởi thư viện quản lý việc tham gia và rời phòng một cách nội bộ và bộ đệm của bạn sẽ bị sai lệch. Thứ hai, nhớ rằng `socket.to(roomId)` loại trừ người gửi trong khi `io.to(roomId)` bao gồm họ, vì vậy hãy chọn đúng cho mục đích phát sóng của bạn.
Tóm lại: namespaces phân tách máy chủ của bạn thành các kênh riêng biệt, rooms nhóm các socket bên trong một namespace để phát sóng nhắm mục tiêu, tự động kết nối lại phục hồi từ các mạng bị mất mà không cần thay đổi mã, và fallback giao thức giúp bạn luôn trực tuyến ngay cả khi WebSocket bị chặn. Cùng nhau các tính năng này loại bỏ boilerplate bạn sẽ phải viết thêm trên top của WebSockets thô.
Bài kiểm tra cuối bài
Ôn lại kiến thức, thử sức và nhận góp ý cho bài làm.