Lập trình

Lập trình socket bằng Python: Mở ra thế giới kết nối mạng

Huy Erick

Hãy thử tưởng tượng rằng bạn muốn gửi và nhận dữ liệu trên internet. Điều đầu tiên bạn cần là một cách để truyền thông tin giữa hai chương trình chạy trên mạng. Và đó...

Hãy thử tưởng tượng rằng bạn muốn gửi và nhận dữ liệu trên internet. Điều đầu tiên bạn cần là một cách để truyền thông tin giữa hai chương trình chạy trên mạng. Và đó chính là vai trò của socket. Socket, một giao diện lập trình ứng dụng mạng, giúp bạn thiết lập kết nối hai chiều giữa hai quy trình để trò chuyện với nhau trên mạng.

Một trong những chức năng quan trọng của socket là định danh ứng dụng để gửi dữ liệu thông qua ràng buộc với một cổng port. Chúng ta có thể nghĩ về cổng port như một con số đại diện cho một ứng dụng cụ thể trên mạng.

Cùng nhau, chúng ta sẽ khám phá lập trình socket bằng Python. Hãy tạo một máy chủ và một máy khách để truyền dữ liệu giữa họ. Đầu tiên, chúng ta sẽ tạo máy chủ.

Tạo máy chủ

Đầu tiên, chúng ta sẽ tạo một máy chủ TCP/IP để lắng nghe trên một cổng cho các yêu cầu từ máy khách. Dưới đây là các bước để tạo một chương trình máy chủ:

  1. Tạo socket với hàm socket(). Chúng ta có thể truyền vào các tham số hoặc để trống. Ở đây, chúng ta sẽ sử dụng phiên bản IP là IPv4 và loại kết nối là TCP.
  2. Gán địa chỉ cho socket bằng cách sử dụng hàm bind(). Chúng ta cung cấp máy chủ và cổng làm tham số.
  3. Khai báo socket sẵn sàng lắng nghe yêu cầu kết nối bằng hàm listen(). Chúng ta có thể chỉ định số lượng tối đa các kết nối đang chờ.
  4. Chấp nhận yêu cầu kết nối từ máy khách bằng hàm accept(). Hàm này trả về hai giá trị: kết nối và địa chỉ của yêu cầu.
  5. Máy chủ có thể gửi dữ liệu tới máy khách bằng hàm send().
  6. Khi hoàn thành, đóng kết nối bằng hàm close().

Ví dụ mã nguồn cho phần máy chủ:

import socket  # Định nghĩa host và port mà máy chủ sẽ chạy và lắng nghe host = 'localhost'  port = 4000  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host, port)) s.listen(1)  # Chỉ chấp nhận 1 kết nối  print("Máy chủ đang lắng nghe trên cổng", port)  c, addr = s.accept() print("Kết nối từ", str(addr))  # Máy chủ sử dụng kết nối để gửi dữ liệu cho máy khách c.send(b"Xin chào, bạn khỏe không?") c.send("Tạm biệt".encode())  c.close()

Tạo máy khách

Giờ chúng ta sẽ tạo máy khách TCP/IP để kết nối với máy chủ trên cổng 4000. Dưới đây là các bước để tạo một chương trình máy khách:

  1. Tạo socket với hàm socket().
  2. Kết nối với máy chủ bằng hàm connect(). Chúng ta cung cấp máy chủ và cổng làm tham số.
  3. Đọc dữ liệu mà máy chủ gửi tới bằng hàm recv().
  4. Đóng socket bằng hàm close().

Ví dụ mã nguồn cho phần máy khách:

import socket  s = socket.socket() s.connect(("localhost", 4000))  # Lắng nghe ở cổng 4000  # Nhập vào tên file filename = input("Nhập vào tên file: ")  # Gửi tên file cho máy chủ s.send(filename.encode())  # Nhận dữ liệu từ máy chủ gửi tới content = s.recv(1024) print(content.decode())  s.close()

Sau khi chạy mã nguồn server.pyclient.py, bạn sẽ thấy máy khách nhận được dữ liệu từ máy chủ.

Gửi file

Nếu chúng ta chỉnh sửa một chút nội dung của hai tệp trên, chúng ta có thể thực hiện chức năng máy chủ gửi nội dung của tệp cho máy khách yêu cầu.

Phía máy chủ:

import socket  host = 'localhost' port = 6767  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host, port)) s.listen(1)  print("Máy chủ đang lắng nghe trên cổng", port)  c, addr = s.accept()  # Nhận tên file do máy khách gửi tới filename = c.recv(1024)  try:     f = open(filename, 'rb')     content = f.read()      # Gửi dữ liệu trong file cho máy khách     c.send(content)     f.close() except FileNotFoundError:     c.send(b"File not found")  c.close()

Phía máy khách:

import socket  s = socket.socket() s.connect(("localhost", 6767))  # Lắng nghe ở cổng 6767  # Nhập vào tên file filename = input("Nhập vào tên file: ")  # Gửi tên file cho máy chủ s.send(filename.encode())  # Nhận dữ liệu từ máy chủ gửi tới content = s.recv(1024) print(content.decode())  s.close()

Dưới đây là kết quả nhận được từ máy chủ:

Trên đây là những ví dụ đơn giản về lập trình socket trong Python mà chúng ta có thể tìm hiểu. Hy vọng rằng bạn đã có những hiểu biết mới và thấy thú vị với lập trình socket.

1