Ở bài này chúng ta sẽ chính thức lập trình ra một hệ thống mạng thực thụ. Tuy nhiên, lập trình mạng có một điểm cực kỳ đặc biệt: Chúng ta không thể làm việc một mình. Chúng ta phải viết 2 file code riêng biệt chạy ở hai cửa sổ khác nhau để chúng tự tìm và "bắt tay" nói chuyện với nhau.
Chúng ta có thể hình dung mô hình Server - Client thông qua câu chuyện quen thuộc của cửa hàng bán dừa :
Server (Người phục vụ / Bác bán dừa): Là người phải đứng yên một chỗ, mở cửa hàng (thuê số phòng/Port) và luôn tai lắng nghe xem có ai gọi cửa không. Server không bao giờ chủ động đi tìm khách, nó chỉ đứng đợi.
Client (Khách hàng / Người mua dừa): Là người chủ động. Client biết địa chỉ nhà (IP) và số phòng (Port) của Server, thế là Client nhấc máy lên gọi điện/kết nối tới Server.
Để thông tuyến bộ đàm, Hệ điều hành bắt hai bên phải thực hiện các lệnh Socket theo đúng thứ tự sau:
Server: bind() (Thuê phòng) $\rightarrow$ listen() (Hóng tai nghe) $\rightarrow$ accept() (Bấm nút nghe).
Client: connect() (Bấm số gọi).
Bố hướng dẫn các con tạo 2 file riêng biệt trong cùng một thư mục nhé.
server_phuc_vu.py (Chạy file này trước)File này đóng vai trò là cửa hàng mini, mở cổng 9999 để đợi khách.
import socket
# 1. Mở bộ đàm Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Địa chỉ IP '127.0.0.1' nghĩa là chạy ngay trên máy này (Localhost)
# Thuê số phòng (Port) là 9999
DIA_CHI_CUA_HANG = ('127.0.0.1', 9999)
# 2. BIND - Gắn địa chỉ và Port vào bộ đàm
server_socket.bind(DIA_CHI_CUA_HANG)
# 3. LISTEN - Đứng tai lên nghe ngóng (Tối đa chờ 5 người xếp hàng)
server_socket.listen(5)
print("🏪 SERVER: Cửa hàng đã mở cửa tại cổng 9999!")
print("🎧 SERVER: Đang đứng im lắng nghe... Bố con mình hãy bật file Client lên nhé!")
# 4. ACCEPT - Máy tính sẽ dừng hình ở đây để đợi chuông reo.
# Khi có khách kết nối, lệnh này sẽ trả về "Bộ đàm riêng" (client_com) và "Địa chỉ khách" (client_address)
client_com, client_address = server_socket.accept()
print(f"\n🎉 SERVER: Có khách vào cửa rồi! Địa chỉ của khách là: {client_address}")
# 5. Đóng bộ đàm khi xong việc
client_com.close()
server_socket.close()
print("🚪 SERVER: Cửa hàng đóng cửa nghỉ ngơi.")
Để nghiệm thu bài này thành công, hãy thực hiện đúng quy trình :
Bước 1: Mở file server_phuc_vu.py lên và bấm Run. Ta sẽ thấy màn hình hiện chữ Đang đứng im lắng nghe... và đứng hình ở đó (do lệnh .accept() đang ngầm đợi hệ thống).
Bước 2: Không tắt cửa sổ Server. Mở một cửa sổ mới (hoặc tab mới trong Thonny/VS Code), mở file client_mua_hang.py lên và bấm Run.
Bước 3 (Khoảnh khắc kỳ diệu): Hãy nhìn sang cửa sổ của Server. Ta sẽ thấy Server lập tức nhảy chữ: 🎉 SERVER: Có khách vào cửa rồi! Hai chương trình hoàn toàn độc lập đã tự tìm thấy nhau thông qua cổng mạng của Hệ điều hành!
Hãy suy nghĩ về câu hỏi logic này để chuẩn bị cho bài học gửi thư tiếp theo:
*"Chúng ta đã thông tuyến điện thoại thành công rồi. Nhưng hiện tại hai máy mới chỉ chạm vào nhau rồi tự dập máy (
close) chứ chưa nói được câu nào với nhau cả.Câu hỏi: Nếu bây giờ ở file Client ta gõ chữ tiếng Việt
"Cho con mua 5 quả dừa"để gửi sang, thì máy chủ Server có đọc được trực tiếp chữ đó luôn không? Hãy nhớ lại kiến thức về dòng điện $0$ và $1$ (Byte) ở bài học trước nhé!"*