Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Lập trình Socket trong Python
Tìm hiểu cách tạo máy khách và máy chủ socket trong Python bằng cách sử dụng thư viện socket. Socket là phương thức giao tiếp hai chiều giữa máy khách và máy chủ, trong khi API REST không cung cấp kết nối song công. Python hỗ trợ tích hợp sẵn cho việc tạo máy chủ socket và kết nối với chúng dưới dạng máy khách. Trong bài viết này, mình sẽ hiểu cách sử dụng thư viện socket trong Python qua các ví dụ về cách tạo máy chủ web socket và kết nối với máy khách.
Hiểu về Web Socket trong Python
Web socket là giao thức truyền thông cho phép kết nối song công và hai chiều để chia sẻ tin nhắn giữa máy khách và máy chủ. Không giống như HTTP, các kết nối web socket được duy trì sau khi thiết lập và chỉ đóng khi được yêu cầu.
Có nhiều loại socket, chẳng hạn như TCP và UNIX, với cấu trúc URL khác biệt. URL của API REST có dạng như http://www.python-engineer.com/blogs/create
, trong khi URL của web socket sẽ có dạng ws://www.python-engineer.com/blogs/comments?id=471
.
Web socket được ứng dụng rộng rãi trong các dịch vụ cần cập nhật thời gian thực và sự kiện đẩy (push-based).
Bài viết này được đăng tại [free tuts .net]
Tạo một Máy Chủ Socket trong Python
Máy chủ socket hoạt động khá khác biệt so với máy chủ API REST. Trong kết nối TCP của socket, mỗi kết nối máy khách sẽ được duy trì cho đến khi đóng.
Các bước cơ bản để tạo máy chủ socket gồm:
- Gán máy chủ vào địa chỉ và cổng.
- Lắng nghe các yêu cầu kết nối.
- Chấp nhận các kết nối mới.
- Trong quá trình kết nối, lắng nghe tin nhắn từ máy khách.
Ví dụ về máy chủ web socket:
import socket SERVER = socket.gethostbyname(socket.gethostname()) PORT = 9797 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((SERVER, PORT)) s.listen(5) print(f"[INFO] Đang lắng nghe tại {SERVER}:{PORT}") while True: conn, addr = s.accept() with conn: print(f"[KẾT NỐI] Đã kết nối với {addr}") while True: data = conn.recv(1024) if not data: break conn.sendall(f"[KẾT NỐI] Đã nhận được {data} từ {addr}".encode()) print(f"[KẾT NỐI] Đã ngắt kết nối từ {addr}")
Các lệnh chính trong lập trình socket là: bind
, listen
, accept
, send
, recv
, và close
. Đối tượng socket được tạo với phương thức socket()
, sau đó được gán vào địa chỉ và cổng với bind()
. Lệnh listen()
giúp máy chủ lắng nghe các yêu cầu kết nối, và accept()
để chấp nhận các yêu cầu đó. Kết nối sau đó được giữ cho đến khi đóng.
Kết nối Socket đồng thời
Để xử lý đồng thời nhiều kết nối, ta có thể sử dụng đa luồng:
import socket import threading SERVER = socket.gethostbyname(socket.gethostname()) PORT = 9797 def client_thread(conn, addr): with conn: print(f"[KẾT NỐI] Đã kết nối với {addr}") while True: data = conn.recv(1024) if not data: break conn.sendall(f"[KẾT NỐI] Đã nhận được {data} từ {addr}".encode()) print(f"[KẾT NỐI] Đã ngắt kết nối từ {addr}") with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((SERVER, PORT)) s.listen(5) print(f"[INFO] Đang lắng nghe tại {SERVER}:{PORT}") while True: conn, addr = s.accept() print(f"[INFO] Tạo luồng cho kết nối {addr}") thread = threading.Thread(target=client_thread, args=(conn, addr)) thread.start()
Với đa luồng, mỗi máy khách kết nối với máy chủ sẽ được xử lý trong một luồng riêng.
Tạo máy khách Socket
Để tạo máy khách, bạn chỉ cần kết nối với máy chủ và gửi dữ liệu. Sau khi hoàn tất việc gửi nhận, đóng kết nối.
Ví dụ máy khách:
import socket import time SERVER = "192.168.56.1" PORT = 9797 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((SERVER, PORT)) client.send("Xin chào thế giới!".encode()) time.sleep(4) client.shutdown(1) client.close()
Kết bài
Qua bài viết này, mình đã cùng nhau tìm hiểu cách sử dụng thư viện socket trong Python để tạo ra một máy chủ và máy khách có khả năng giao tiếp hai chiều. Từ việc thiết lập một kết nối đơn giản cho đến xử lý đồng thời nhiều kết nối với đa luồng, bạn đã có được những kỹ năng cơ bản cần thiết để phát triển các ứng dụng thời gian thực sử dụng Web Socket. Việc nắm vững các kiến thức này sẽ giúp bạn linh hoạt hơn trong việc xây dựng các hệ thống cần truyền tải dữ liệu liên tục và hiệu quả giữa máy khách và máy chủ.