#

Socket.IO là gì? Cách hoạt động của Socket.IO

 06/06/2022 - 15:06 Trịnh Duy Thanh

Làm thế nào mà các thiết bị máy tính khác nhau có thể giao tiếp với nhau? Trước đây có khá nhiều công cụ hỗ trợ nhưng chúng không có giải pháp nào là hoàn hảo. Vì thế, các nhà cung cấp đã phát triển ra Socket.IO – một công cụ cho phép thiết lập các giao tiếp hiệu quả và nhanh chóng.

Trong bài viết này, BKHOST giúp bạn hiểu thêm Socket.IO là gì, cách hoạt động của nó như thế nào và khi nào nên sử dụng.

Socket.IO là gì?

Socket io la gi

Mua tên miền giá rẻ tại BKHOST

BKHOST đang có chương trình khuyến mại cực sock cho khách hàng đăng ký mới tên miền, giá chỉ từ 59k/năm đầu.

Nhanh tay kiểm tra và đăng ký tên miền để bảo vệ thương hiệu của bạn trên internet.

Đăng ký ngay:

Check tên miền

Socket.IO là công cụ kết nối mở cho phép máy chủ và máy khách giao tiếp hai chiều với nhau theo thời gian thực. Khi máy chủ có Socket.IO và máy khách có gói Socket.IO trong trình duyệt thì việc liên kết sẽ được thực hiện.

So do su dung socket io

Socket.IO sử dụng Engine.IO để thiết lập kết nối và trao đổi dữ liệu tạo điều kiện cho việc triển khai máy chủ của khách hàng. Engine.IO được sử dụng để triển khai máy chủ và Engine.IO-client được sử dụng cho máy khách. Ngoài ra, Socket.IO còn dựa trên nền tảng Engine.IO để thiết lập kết nối long-polling thông qua xhr-polling và nâng cấp lên phương pháp kết nối tối ưu hơn.

Socket.IO hoạt động như thế nào?

Socket IO hoat dong nhu the nao

Socket.IO sử dụng tính năng giao tiếp hai chiều để phát triển các ứng dụng trò chuyện. Các tin nhắn gửi về máy chủ sẽ được gửi trực tiếp cho máy khách mà không cần bất cứ yêu cầu trung gian nào.

Sử dụng Socket.IO để trò chuyện

Máy chủ

Đầu tiên hãy cài đặt node.js, sau đó sử dụng express để đơn giản hoá thiết lập ứng dụng.

Tạo folder mới với đoạn code sau:

$ mkdir Socket.IO-example
cd Socket.IO-example
npm install Socket.IO express

Thiết lập máy chủ và nhập các gói require sau:

const app = require("express")();
const http = require("http").createServer(app);
const io = require("Socket.IO")(http);

Thiết lập một file index.html mà máy chủ gửi về:

app.get("/", (req, res) => res.sendFile(__dirname + "/index.html"));

Thiết lập một connection điều khiển chức năng của Socket.IO:

io.on("connection", function(socket) {
console.log(“socket connected”);
});

Thiết lập cổng 3000 trên máy chủ:

http.listen(3000, () => console.log("listening on http://localhost:3000")

Khởi động ứng dụng.nodeindex.js và mở trang trên trình duyệt.

Máy khách

Thiết lập kết nối socket. IO bằng các lệnh:

<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
</script>

Cách nhận tin nhắn qua lại

Máy chủ

Sử dụng hàm io.emit() để gửi tin nhắn từ máy chủ đến máy khách:

io.on("connection", function(socket) {
io.emit(“user connected”);
});

Sử dụng socket.broadcast.emit() để gửi tin nhắn cho tất cả mọi người trừ những người đang ở trong trạng thái kết nối.

Hoặc để thêm người nhận cho tin nhắn, sử dụng lệnh sau. Người nhận mới sẽ nhận được những tin nhắn từ lúc bắt đầu được thêm vào:

io.on("connection", function(socket) {
io.emit(“user connected”);
socket.on(“message", function(msg) {
io.emit("message", msg);
});
});

Máy khách

Sử dụng tệp index.html để hiển thị đầu vào và vùng chứa của tin nhắn:

<!DOCTYPE html>
<html lang="en">
 <head>
   <meta charset="UTF-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <meta http-equiv="X-UA-Compatible" content="ie=edge" />
   <title>Socket.io Example</title>
 </head>

 <body>
   <h1>Our Socket.io Chat Application</h1>
   <div>
     <h2>Messages</h2>
     <ul></ul>
   </div>
   <form action="">
     <input type="text" />
     <button>Send</button>
   </form>
   <script src="/socket.io/socket.io.js"></script>
   <script>
     const socket = io();
   </script>
 </body>
</html>

Tiếp theo hãy bổ sung một số logic vào <script>:

<script>

 // select relevant elements
 const form = document.querySelector("form");
 const input = document.querySelector("input");
 messageList = document.querySelector("ul");

 // establish socket.io connection
 const socket = io();

 // handle sending message to server & input reset
 function sendMessage(e) {
   // prevent form submission refreshing page
   e.preventDefault();
   // send input value to server as type 'message'
   socket.emit("message", input.value);
   // reset input value
   input.value = "";
 }

 // add listener to form submission
 form.addEventListener("submit", sendMessage);

 // add message to our page
 function addMessageToHTML(message) {
   // create a new li element
   const li = document.createElement("li");
   // add message to the elements text
   li.innerText = message;
   // add to list of messages
   messageList.append(li);
 }
  // watch for socket to emit a 'message'
 socket.on("message", addMessageToHTML);

 // display message when a user connects
 function alertUserConnected() {
   addMessageToHTML("User connected");
 }
  // watch for socket to emit a 'user connected' event
 socket.on("user connected", alertUserConnected);

</script>

Các hàm socket.on có hai chức năng event và callback. Nếu máy chủ phát hiện ra các event phù hợp, ngay lập tức lệnh callback sẽ được khởi động bằng cách hiển thị trên màn hình máy chủ.

Duy trì & vận hành Socket.IO

Máy chủ Node.js tạo điều kiện giúp thiết lập một ứng dụng giao tiếp bằng Socket.IO dễ dàng với tính năng tùy chọn thời gian thực và giới hạn người dùng ứng dụng. Nếu như bạn muốn thiết lập một ứng dụng giao tiếp giữa các doanh nghiệp giống như CRM thì Socket.IO sẽ tạo ra các thư viện mạng không đồng bộ làm cho việc kết nối bị gián đoạn, các dữ liệu dễ dàng bị đánh cắp. Hơn nữa, socket là một công cụ kết nối mở không có chức năng quản lý sâu về các kết nối của người dùng với mọi máy chủ khác nhau.

Giải pháp khắc phục duy nhất đó là sử dụng kho lưu trữ dữ liệu bộ nhớ Redis như pub/sub để gửi thông báo cho các máy chủ về số người tham gia có thể nhận được tin nhắn. Ngoài ra, Socket.IO còn tích hợp với pub/sub và máy chủ để chia sẻ thông tin hiệu quả hơn.

Ngoài sử dụng Redis, bạn cũng có thể tham khảo các công cụ khác như CoreOS. Đây là một loại công cụ cho phép chia nhỏ các đơn vị trên phần cứng máy chủ và giúp cập nhật các phiên bản mới nhanh hơn.

Tuy nhiên, có một vấn đề đối với WebSockets đó là khi kết nối bị gián đoạn các yêu cầu thăm dò sẽ được gửi về hệ thống hoặc một số máy chủ khác với dòng lỗi “Error during WebSocket handshake: Unexpected response code: 400”.

Để khắc phục vấn đề này, bạn có thể sử dụng định tuyến máy khách dựa trên địa chỉ gốc có sẵn hoặc sử dụng cookie. Tài liệu của Socket.IO có thể giải quyết lỗi trong hầu hết các môi trường và được xem là biện pháp khắc phục hiệu quả.

Giới hạn của Socket.IO

Trước khi lựa chọn sử dụng bất kỳ công nghệ nào cho sản phẩm cần tìm hiểu về sự tương thích và nhu cầu của sản phẩm đó. Socket.IO có thời gian kết nối ban đầu hiệu quả hơn so với WebSocket.IO bằng cách sử dụng long-polling và xhr-polling. Để giảm thiểu chi phí Socket.IO, người dùng có thể lựa chọn cách chỉ kết nối với WebSockets.

Máy khách:

Const socket = io({transports: [“websocket”], upgrade: false});

Máy chủ:

io.set("transports", ["websocket"]);

Máy khách cần tải xuống tệp JavaScript Socket.IO 61,2 KB để bổ sung các thông tin cần thiết.

Socket.IO trong tương lai

Phiên bản Socket.IO V4 chính thức ra mắt vào 9/3/2021 là một công cụ dọn dẹp API có tính năng hỗ trợ tăng thời gian chờ cho các sự kiện, tính cố định và bản sửa lỗi.

Socket.IO phát triển chậm về lượt tải xuống NPM.

Socket IO trong tuong lai-1

Sockjs và WS đang phát triển đều đặn và mạnh hơn Socket.IO về lượt tải xuống NPM.

Socket IO trong tuong lai-2

Hiện nay, hầu hết các trình duyệt đều có phần “Can I use” cho phép sử dụng WebSockets. Điều này cho thấy rằng WS có tính năng vượt trội hơn trong việc xử lý kết nối socket trên máy chủ. Tuy nhiên đối với máy khách thì phải sử dụng API trình duyệt gốc.

Socket IO trong tuong lai-3

Như vậy, công cụ Socket.IO là một lựa chọn tuyệt vời dành cho bạn trong việc thiết lập kết nối hai chiều hỗ trợ việc tạo các ứng dụng trò chuyện trở nên đơn giản và dễ dàng hơn.

Một vấn đề nan giải của Socket.IO đó là các kết nối nếu không phải là WebSocket thì quá trình thiết lập sẽ trở nên khó khăn và phức tạp hơn. Vì vậy, nhu cầu sử dụng Socket.IO sẽ phụ thuộc vào các mục đích cá nhân về thời gian thực hay hiệu suất hoạt động của dịch vụ và ứng dụng. Ngoài ra, với các hỗ trợ của WebSocket sẽ giúp người dùng có nhiều lựa chọn đối với triển khai gốc hơn.

Tổng kết về Socket.IO

Trên đây là toàn bộ những thông tin về Socket.IO và những tính năng mà nó đem lại cho việc xây dựng hệ thống giao tiếp giữa các máy chủ và máy khác. Hy vọng qua đây bạn đã có được những kiến thức để thiết lập Socket.IO cho máy tính một cách hiệu quả.

Nếu còn có thêm thắc mắc gì về các vấn đề giao tiếp viễn thông hoặc cần các dịch vụ hệ thống mạng, hãy để lại bình luận ở bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.

P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.

Đăng ký Hosting Giá Rẻ chất lượng quốc tế

BKHOST cung cấp dịch vụ Hosting Giá Rẻ, sử dụng 100% ổ cứng SSD Enterprise được xây dựng trên nền tảng công nghệ điện toán đám mây, cho tốc độ cao, ổn định và bảo mật tối đa.

  • Giảm giá lên đến 40%.
  • Chi từ 9k/tháng.
  • Miễn phí gói bảo mật SSL Let’s Encrypt.

Đăng ký ngay:

hosting việt nam giá rẻ

Tôi là Trịnh Duy Thanh, CEO & Founder Công ty Cổ Phần Giải Pháp Mạng Trực Tuyến Việt Nam - BKHOST. Với sứ mệnh mang tới các dịch vụ trên Internet tốt nhất cho các cá nhân và doanh nghiệp trong nước và quốc tế, tôi luôn nỗ lực hết mình nâng cấp đầu tư hệ thống phần cứng, nâng cao chất lượng dịch vụ chăm sóc khách hàng để đem đến những sản phẩm hoàn hảo nhất cho người tiêu dùng. Vì vậy, tôi tin tưởng sẽ đem đến các giải pháp CNTT mới nhất, tối ưu nhất, hiệu quả nhất và chi phí hợp lý nhất cho tất cả các doanh nghiệp.
Bình luận

Thanh toán linh hoạt

Chúng tôi chấp nhận thanh toán như ATM, Visa, Internet Banking, Paypal, Baokim, Ngân lượng

Gọi ĐT tư vấn ngay
Chat ngay qua Zalo
Chat ngay qua Messenger