Socket IO là gì? Hướng dẫn cách dùng Socket IO cơ bản và hiệu quả mà bạn nên biết
https://fptshop.com.vn/https://fptshop.com.vn/
Nhựt Liên
2 năm trước

Socket IO là gì? Hướng dẫn cách dùng Socket IO cơ bản và hiệu quả mà bạn nên biết

Socket.IO là gì? Hệ thống hoạt động bằng cách sử dụng các phương pháp như Long Polling và WebSockets để tạo kết nối real time giữa client và server. Công nghệ còn cung cấp các tính năng mở rộng để quản lý và tương tác với các kết nối này một cách hiệu quả nhất.

Chia sẻ:

Socket IO là gì? Thắc mắc được nhiều lập trình viên đưa ra khi mới tìm hiểu về công cụ kết nối giao thức. Hệ thống đóng vai trò quan trọng trong việc liên kết Client và Server cho các ứng dụng Realtime. Để hiểu hơn về cách sử dụng Socket IO, mời bạn cùng FPT Shop khám phá bài viết dưới đây. 

Định nghĩa Socket IO là gì?

Socket.IO là một thư viện mã nguồn mở trong Node.js được phát triển từ năm 2010. Mục đích nhằm tạo ra một môi trường giao tiếp thời gian thực và hai chiều giữa máy chủ và máy khách trên Internet. Nền tảng cho phép gửi và nhận dữ liệu một cách tức thì và tối ưu hóa việc sử dụng tài nguyên.

Những kiến thức cơ bản cần biết về hệ thống

Socket IO là gì?

Hệ thống giúp ứng dụng đòi hỏi tốc độ phản hồi cao như trò chơi trực tuyến, chat trực tuyến, cập nhật thông tin trong thời gian thực,v.v. Tuy nhiên, Socket.IO không phải là một ngôn ngữ mà là một thư viện mã nguồn mở. 

Công nghệ được tích hợp với nhiều ngôn ngữ khác nhau như PHP, ASP.NET, Node.js để tạo ra một môi trường giao tiếp hai chiều giữa máy chủ và máy khách.

Những ưu điểm vượt trội của Socket IO

Nâng cao tính bảo mật

Socket.IO xây dựng dựa trên Engine.IO và hỗ trợ việc thiết lập kết nối bảo mật thông qua sự hỗ trợ của các phương thức giao tiếp tốt hơn như Websocket. Ngoài ra, Socket.IO cũg cung cấp một số cơ chế bảo mật bổ sung, bao gồm:

Công nghệ có độ bảo mật cao

  • Bảo mật dựa trên TLS/SSL: Socket.IO hỗ trợ kết nối an toàn thông qua việc sử dụng giao thức HTTPS và WSS (WebSocket over TLS/SSL). Điều này có tác dụng mã hóa dữ liệu trên đường truyền và ngăn chặn các cuộc tấn công theo dõi hoặc thay đổi dữ liệu.
  • Hỗ trợ cân bằng tải và proxy: Socket.IO có thể dễ dàng tích hợp với các cơ chế cân bằng tải và proxy để tăng cường bảo mật và khả năng chịu tải của hệ thống.
  • Hỗ trợ cho tường lửa: Socket.IO cung cấp các cơ chế để vượt qua các tường lửa và phần mềm chống virus thông qua việc sử dụng các cổng mạng phổ biến như cổng 443 (HTTPS).

Chế độ kết nối Server tự động

Socket.IO có tính năng tự động kết nối đến server giúp việc giao tiếp giữa client và server trở nên linh hoạt và dễ dàng hơn. Khi mất kết nối trong quá trình khởi chạy, Socket.IO sẽ liên tục cố gắng kết nối đến server cho đến khi kết nối lại thành công hoặc đạt đến ngưỡng thời gian chờ đặt trước.

Tự động kết nối các tính năng

Socket IO là gì?

Tính năng này được tùy chỉnh để ngăn chặn kết nối tự động đến server thông qua cấu hình của Socket.IO hoặc trong mã nguồn của ứng dụng. Việc tắt tính năng kết nối tự động có thể hữu ích trong những trường hợp cụ thể mà người phát triển muốn kiểm soát chặt chẽ việc thiết lập kết nối của ứng dụng.

Công nghệ mã hóa nhị phân

Socket.IO hỗ trợ truyền và nhận dữ liệu dạng nhị phân trong cả môi trường trình duyệt và Node.js. Trong trình duyệt, chương trình hỗ trợ việc truyền dữ liệu dạng ArrayBuffer và Blob. Từ đó cho phép người dùng truyền các dữ liệu nhị phân như hình ảnh, video, hoặc âm thanh qua kết nối Socket.IO một cách hiệu quả.

Chế độ mã hóa tiên tiến và hiện đại

Socket IO là gì?

Trong môi trường Node.js, Socket.IO hỗ trợ truyền dữ liệu dạng Buffer. Điều này có nghĩa là bạn có thể truyền các dữ liệu nhị phân như file, dữ liệu cấu trúc... qua kết nối Socket.IO.

Với khả năng hỗ trợ mã hóa nhị phân, Socket.IO cho phép ứng dụng truyền và nhận dữ liệu nhị phân một cách linh hoạt. Đây là một điều kiện cơ bản nhằm phục vụ cho nhiều loại ứng dụng thực tế từ trò chơi trực tuyến đến ứng dụng đa phương tiện.

Tiện ích tạo kênh và phòng

- Tạo kênh (namespace): Socket.IO cho phép tạo ra các kênh hoặc không gian phân tán để phân chia và quản lý thông tin tương tác giữa server và client. Như vậy, các module hoặc phần của ứng dụng có thể tương tác với nhau thông qua các kênh riêng biệt mà không ảnh hưởng đến các kênh khác.

Nâng cao chế độ tương tác

- Tạo phòng (room): Socket.IO cũng hỗ trợ việc tạo ra các phòng để nhóm các client thành các nhóm nhằm gửi thông báo hoặc dữ liệu tới toàn bộ nhóm đó. Điều này cho phép gửi thông báo đến một nhóm người dùng cụ thể được kết nối qua các thiết bị hoặc kênh nhất định.

Hướng dẫn cách sử dụng Socket.IO

Để sử dụng Socket.IO trong một ứng dụng realtime, cách thức triển khai trên cả phía server và phía client như sau:

Phần 1 - Server

Theo dõi cách sử dụng hệ thống

- Node.js: Nếu server của bạn sử dụng Node.js, bạn có thể cài đặt Socket.IO bằng cách sử dụng npm, trình quản lý gói của Node.js. Bạn có thể tạo một server WebSocket đơn giản và tích hợp Socket.IO trong mã nguồn Node.js để tạo ra các kết nối realtime với client.

- PHP hoặc ASP.NET: Đối với các ngôn ngữ lập trình như PHP hoặc ASP.NET, bạn cũng có thể sử dụng Socket.IO. Tuy nhiên, quá trình cài đặt và triển khai sẽ có nhiều điểm khác biệt như sau:

  • Đối với PHP, bạn cần sử dụng một thư viện tương tự như Ratchet để tạo WebSocket server và sau đó tích hợp Socket.IO trong client để tương tác với server. 
  • Đối với ASP.NET thì bạn có thể sử dụng SignalR. Đây là một thư viện realtime communication framework của Microsoft tương tự như việc triển khai trong PHP.

Phần 2 – Client

Chủ động tích hợp với ứng dụng

Với phần client, bất kỳ ứng dụng web hoặc ứng dụng di động nào cũng có thể sử dụng Socket.IO bằng cách tích hợp thư viện Socket.IO trong mã nguồn JavaScript của mình. Điều này cho phép client tạo kết nối tới server Socket.IO và truyền nhận dữ liệu realtime một cách dễ dàng.

Phương thức hoạt động của Socket.IO

Socket.IO hoạt động bằng cách sử dụng mô hình giao thức "Long Polling" hoặc WebSockets để tạo và duy trì kết nối real time giữa client và server. Quy trình này hoạt động như sau:

Long Polling

Trong trường hợp trình duyệt hoặc client không hỗ trợ WebSockets, Socket.IO sẽ sử dụng phương pháp long-polling. Khi client gửi yêu cầu tới server, server sẽ không trả về ngay lập tức mà duy trì kết nối.

Điều kiện hoạt động chính thức

Hệ thống chỉ trả về khi có dữ liệu mới hoặc sau một khoảng thời gian nhất định. Sau đó, client sẽ gửi yêu cầu mới ngay lập tức để duy trì kết nối. Quá trình này tiếp diễn để tạo ra một luồng thông tin realtime giữa client và server qua HTTP.

WebSockets

Trong trường hợp trình duyệt hoặc client hỗ trợ WebSockets, Socket.IO sẽ sử dụng giao thức này để tạo kết nối full-duplex giữa client và server. Điều này cho phép cả server và client gửi và nhận dữ liệu từ nhau một cách tức thì mà không cần phải tạo các yêu cầu HTTP mới.

Mục tiêu liên kết không giới hạn

Socket.IO còn hỗ trợ các tính năng như phòng (room) và kênh (namespace) để nhóm và phân loại các kết nối theo mục đích sử dụng. Nền tảng thường bổ sung các sự kiện (events) để truyền tải dữ liệu giữa server và client một cách linh hoạt.

Ví dụ về code khai báo của Socket.IO trên Server

// build server, khai báo sử dụng socket io

var express = require("express");

var app = express();

app.use(express.static("public"));

var server = require("http").Server(app);

var io = require("socket.io")(server);

// STEP 2

io.on("connection", function(socket) {

    socket.on("disconnect", function() {});

    //server lắng nghe dữ liệu từ client

    socket.on("Client-sent-data", function(data) {

        //sau khi lắng nghe dữ liệu, server phát lại dữ liệu này đến các client khác

        console.log('client send data', data);

        socket.emit("Server-sent-data", data);

    });

});

// END STEP 2

server.listen(3000);

console.log('Server listen on http://127.0.0.1:3000')

Và đây là code khai báo socket io trên client.

<html>

<head>

<title>Demo Socketio - Homepage</title>

<script

            src="https://code.jquery.com/jquery-1.12.4.min.js"

            integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="

            crossorigin="anonymous"></script>

            <script src= integrity="sha512-+l9L4lMTFNy3dEglQpprf7jQBhQsQ3/WvOnjaN/+/L4i0jOstgScV0q2TjfvRF4V+ZePMDuZYIQtg5T4MKr+MQ==" crossorigin="anonymous"></script>

<script>

var socket = io("http://localhost:3000");

$(document).ready(function() {

$("#send").click(function() {

socket.emit("Client-sent-data", "Hello world");

});

});

</script>

</head>

<body>

<div>

<button id="send">Send</button>

</div>

</body>

</html>

Để tiếp nhận và gửi dữ liệu trong Socket.IO, chúng ta sử dụng hai phương thức chính: socket.on() để lắng nghe và tiếp nhận dữ liệu, còn socket.emit() để phát dữ liệu đi.

Phía server, chúng ta lắng nghe sự kiện hoặc dữ liệu từ client thông qua phương thức socket.on(). Dưới đây là một ví dụ đơn giản:

io.on('connection', (socket) => {

  console.log('A user connected');

  socket.on('chat message', (msg) => {

    console.log('message: ' + msg);

    io.emit('chat message', msg); // Gửi dữ liệu nhận được từ một client tới tất cả các client khác

  });

});

Trong đoạn mã này, khi một client kết nối tới server thông qua io.on('connection', ...), server sẽ lắng nghe sự kiện 'chat message' từ client thông qua socket.on('chat message', ...). Khi server nhận được thông điệp từ client, nó có thể xử lý và gửi lại dữ liệu đó tới tất cả các client khác thông qua io.emit('chat message', msg).

Phía client, chúng ta sử dụng socket.emit() để gửi dữ liệu lên server. Ví dụ:

// Gửi dữ liệu từ client tới server

socket.emit('chat message', 'Hello, world!');

Trong đoạn mã trên, client gửi thông điệp 'Hello, world!' tới server thông qua sự kiện 'chat message' bằng cách sử dụng socket.emit().

Từ các ví dụ trên, bạn có thể thấy cách mà server và client có thể tương tác với nhau thông qua việc sử dụng socket.on() và socket.emit(), cung cấp một cơ chế linh hoạt để truyền tải dữ liệu realtime giữa server và client trong ứng dụng sử dụng Socket.IO.

Ví dụ minh họa về code phía server

io.on("connection", function(socket)

{

socket.on("disconnect", function()

{

});

         //server lắng nghe dữ liệu từ client

socket.on("Client-sent-data", function(data)

{

//sau khi lắng nghe dữ liệu, server phát lại dữ liệu này đến các client khác

                socket.emit("Server-sent-data", data);

});

});

// create route, display view

Còn đây là code phía client

//client gửi dữ liệu lên server

$(document).ready(function()

{

$("#send").click(function()

{

socket.emit("Client-sent-data", "Hello world");

});

});

</script>

</head>

<body>

<h1>Demo Socketio</h1>

<div>

<button id="send">Send</button>

</div>

</body>

</html>

parameter thứ nhất của cả socket.on và socket.emit đều đại diện cho tên sự kiện (hoặc tên đường truyền) để xác định loại dữ liệu hoặc hành động sẽ được truyền đi.

Nếu bạn muốn truyền và nhận dữ liệu chung trong 1 đoàn truyền, bạn phải đảm bảo rằng tên sự kiện này phải giống nhau. Khi server gửi dữ liệu đi thông qua socket.emit, client cũng phải có một sự kiện với tên tương tự để với dữ liệu đó.

Dưới đây là một ví dụ cụ thể:

Phía server:

// Server gửi dữ liệu với tên sự kiện 'message'

socket.emit('message', 'Hello, client!');

Phía client:

// Client lắng nghe và nhận dữ liệu với sự kiện 'message'

socket.on('message', function(data) {

  console.log('Server says: ' + data);

});

Trong ví dụ này, server gửi dữ liệu đi với tên sự kiện là 'message', và client lắng nghe dữ liệu với cùng tên sự kiện 'message'. Khi server gửi dữ liệu đi, client sẽ nhận được thông điệp và xử lý dữ liệu theo cách mà nó định nghĩa trong hàm lắng nghe.

Điều này xác định rõ ràng rằng cả server và client đều sử dụng tên sự kiện 'message' để truyền và nhận dữ liệu chung trong cùng một đoạn truyền.

Tạm kết

Những chia sẻ trong bài viết trên giới thiệu Socket IO là gì và những đặc điểm cơ bản của giao thức. Hy vọng bạn đọc đã hiểu và biết cách áp dụng đầy đủ các bước chuyển tiếp dữ liệu trên máy chủ. 

Xem thêm: 

Tại FPT Shop cung cấp nhiều dòng thiết bị công nghệ như máy tính, điện thoại, phụ kiện. Bạn có thể lựa chọn nhiều sản phẩm chất lượng với giá cả ưu đãi tại đây. 

Thương hiệu đảm bảo

Thương hiệu đảm bảo

Nhập khẩu, bảo hành chính hãng

Đổi trả dễ dàng

Đổi trả dễ dàng

Theo chính sách đổi trả tại FPT Shop

Giao hàng tận nơi

Giao hàng tận nơi

Trên toàn quốc

Sản phẩm chất lượng

Sản phẩm chất lượng

Đảm bảo tương thích và độ bền cao