Lập Trình Web Socket Với Python Như Thế Nào?

Lập Trình Web Socket Với Python Như Thế Nào?

Nội dung 

  1. Socket là gì?
  2. Tại sao cần socket
  3. Cơ chế hoạt động của socket 
  4. Phân loại socket. Ưu và nhược điểm 
  5. Xây dựng một giao tiếp socket bằng Python
  6. Tạm kết 

1. Socket là gì?

"A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to" - theo oracle 

Tạm dịch, một socket là một điểm cuối (endpoint) của một liên kết thông tin liên lạc 2 chiều giữa 2 chương trình chạy trên hệ thống mạng. Một socket được liên kết với một cổng (PORT) để tầng TCP có thể định danh ứng dụng nào đã gửi dữ liệu đến.

Như vậy, socket được sử dụng cho phép một process (hay program) này nói chuyện với một process (hay program) khác và duy trì kết nối này.

2. Tại sao cần socket

Thông thường có 2 dạng socket là web socketunix socket.

  • Web socket là công nghệ hỗ trợ giao tiếp 2 chiều giữa client và server dựa trên một giao thức kết nối (thường là TCP) để tạo một kết nối hiệu quả và ít tốn kém.
  • Unix socket là một kết nối chia sẻ dữ liệu giữa các process khác nhau trong cùng một máy tính. Khác với Web socket sử dụng một giao tiếp mạng để kết nối trên môi trường internet, Unix socket được thực hiện ở nhân hệ điều hành nhờ vậy có thể tránh được các bước như kiểm tra routing, do đó đem lại tốc độ nhanh hơn và nhẹ hơn.

Web socket sẽ là đối tượng quan tâm chính của chúng ta ở đây và phần sau của bài viết vậy ... tại sao cần sử dụng socket?

  • Thứ nhất, nếu như không sử dụng socket, ta hoàn toàn có thể để client gửi request liên tục sau mỗi khoảng thời gian chẳng hạn mỗi 3 giây tới server để kiểm tra liệu dữ liệu có cập nhật mới hơn hay không. Nếu có thì client sẽ cập nhật nó vào ứng dụng. Tuy nhiên, cách làm này rất "dở" vì server luôn bị làm phiền bởi client chưa kể tới việc băng thông bị lãng phí và khoảng thời gian giữa mỗi lần gửi request nếu đủ lớn cũng khiến ứng dụng không thể realtime được.
    Socket sẽ giúp giải quyết vấn đề này bằng việc duy trì kết nối để cập nhật dữ liệu một cách realtime.
  • Thứ hai, ta có thể sử dụng cùng lúc nhiều kết nối socket để tiết kiệm thời gian cũng như nâng cao hiệu suất làm việc.
  • cuối cùng là socket được hỗ trợ trên rất nhiều nền tảng phần cứng lẫn phần mềm, thích hợp với hầu hết mọi thiết bị cũng như môi trường. 

3. Cơ chế hoạt động của socket

Socket là thiết lập một kết nối giữa client và server thông qua giao thức TCP/IP hay UDP để truyền và nhận dữ liệu qua internet. Để nói thêm, một điểm cuối (endpoint) được định nghĩa là cặp IPPORT. Mọi kết nối TCP được xác định duy nhất bởi hai điểm cuối của nó do vậy ta có thể tạo rất nhiều kết nối giữa client và server ( thông thường mỗi máy có hàng chục nghìn cổng kết nối - PORT).  

Vậy socket sử dụng giao thức TCP/IP hoạt động như thế nào?

  • Đầu tiên client sẽ mở một kết nối TCP và cố gắng kết nối với server qua một PORT quy định.

  • Nếu kết nối thành công, server chấp nhận kết nối nó sẽ mở ra một PORT và duy trì kết nối này. Kể từ đây, cặp endpoint <Client_IP, PORT1> vs <Server_IP, PORT2> được đặt một trạng thái là Keep-Alive, tức là kết nối có còn sống hay không. Việc đặt trạng thái là còn sống hay không phụ thuộc vào 3 yếu tố chính là khoảng thời gian không có tín hiệu, khoảng thời gian chờ bên kia phản hồi và số lần thử lại nếu kết nối gặp lỗi. 

Sở dĩ kết nối được duy trì là do PORT đã mở thì sẽ không đóng lại cho đến khi các điều kiện nói ở trên bị vi phạm hoặc client gửi yêu cầu đóng kết nối. 

Nói dễ hiểu hơn, client thiết lập một kết nối đến server để giao tiếp và nó chỉ việc ngồi nghe (listening) mà không phải gửi request liên tục. Server thấy có dữ liệu mới sẽ kiểm tra xem trạng thái kết nối Keep-Alive, nếu kết nối còn nó sẽ gửi dữ liệu qua cho client.

Socket sử dụng giao thức UDP, client và server sẽ không thiết lập kết nối, server chỉ cần biết địa chỉ client và đẩy dữ liệu đến đó mà không cần biết dữ liệu có tới đầy đủ hay không.

4. Phân loại Web socket. Ưu và nhược điểm.

Dựa trên giao thức mạng, người ta phân ra làm 2 dạng socket.

  • Stream socket: 

Dựa trên giao thức TCP, việc truyền dữ liệu chỉ thực hiện khi client với server đã thiết lập kết nối. Stream socket còn gọi là socket hướng kết nối.

-> Ưu điểm : Kết nối cần được xác định rõ ràng nên đảm bảo dữ liệu sẽ được truyền đi có tính tin cậy và toàn vẹn.

-> Nhược điểm : Cần đợi client thiết lập kết nối

  • Datagram socket:

Dựa trên giao thức UDP, việc truyền dữ liệu không cần thiết lập kết nối. Còn gọi là socket không hướng kết nối.

-> Ưu điểm : Do không cần thực hiện kết nối nên giảm thời gian trễ cho các quá trình xác thực, làm tăng tốc độ truyền dữ liệu. 

-> Nhược điểm : Không tin cậy và không đảm bảo dữ liệu toàn vẹn khi gửi tới client.

Trong thực tế, Datagram socket thường sử dụng để đẩy đi dữ liệu tin nhắn chẳng hạn như chat game, server cứ đẩy liên tục các tin nhắn mới mà không cần quan tâm client đã nhận được hay chưa, đơn giản là nó làm tăng tốc độ xử lý trong game.

5. Xây dựng một giao tiếp socket bằng python 

Trong ví dụ dưới đây ta sẽ sử dụng thư viện socket của python, cùng tìm hiểu một số phương thức nhé:

  • bind(ip_address, port) : Dùng để lắng nghe đến địa chỉ ip và cổng
  • connect(ip_address) : Thiết lập một kết nối từ client đến server.
  • recv(bufsize, flag) : Phương thức này được sử dụng để nhận dữ liệu qua giao thức TCP.
  • recvfrom(bufsize, flag) : Nhận dữ liệu qua UDP
  • send(byte, flag) : Phương thức này để gửi dữ liệu qua TCP
  • sendto(bytes, flag) : Gửi dữ liệu qua UDP 
  • close() : Đóng một kết nối 

Tìm hiểu thêm về các phương thức tại socket docs

Dưới đây là code demo 

  • server.py

  • client.py

  • Test

Tạm kết

Việc tăng tốc độ kết nối và tối ưu tài nguyên sử dụng là một nhiệm vụ rất quan trọng trong xây dựng một hệ thống máy tính. Một website hay một mobile app có tốc độ tải mượt sẽ làm tăng trải nghiệm khách hàng sẽ thu hút và giữ chân khách hàng nhiều hơn là một hệ thống xử lý chậm chạp. Socket là một công nghệ hoàn hảo cho nhiệm vụ này.

Trên đây là những kiến thức cần biết về socket và ví dụ với python. Demo này chỉ mang tính chất thử nghiệm kết nối, tính hiệu quả chỉ thể hiện trong thực tế. Nếu có góp ý hay câu hỏi gì các bạn hãy để lại bên dưới comment và nếu cảm thấy bài viết này hữu ích hãy giúp mình một đánh giá 5 sao. 

Thank for reading!

[References]

  1. https://docs.oracle.com
  2. https://viblo.asia
  3. https://toidicode.com