Socket là endpoint giao tiếp hai chiều giữa các tiến trình (cùng máy hoặc qua mạng). Python module socket hỗ trợ TCP (SOCK_STREAM) và UDP (SOCK_DGRAM).
TCP Server
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
server.bind((host, port))
server.listen(5)
print(f"Server listening on {host}:{port}")
while True:
client, addr = server.accept()
print(f"Connected: {addr}")
client.send(b"Thank you for connecting")
client.close()
TCP Client
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345
client.connect((host, port))
print(client.recv(1024).decode())
client.close()
UDP Server (connectionless)
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('localhost', 12345))
while True:
data, addr = server.recvfrom(1024)
print(f"From {addr}: {data.decode()}")
server.sendto(b"ACK", addr)
UDP Client
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"Hello UDP", ('localhost', 12345))
data, _ = client.recvfrom(1024)
print(data.decode())
Các phương thức Socket chính
| Method | Mô tả |
|---|---|
| bind((host, port)) | Gán địa chỉ cho socket (server) |
| listen(backlog) | Nghe kết nối (TCP) |
| accept() | Chấp nhận kết nối, trả (conn, addr) |
| connect((host, port)) | Kết nối đến server (TCP) |
| send(data) | Gửi dữ liệu (TCP) |
| recv(bufsize) | Nhận dữ liệu (TCP) |
| sendto(data, addr) | Gửi UDP |
| recvfrom(bufsize) | Nhận UDP, trả (data, addr) |
| close() | Đóng socket |
Lưu ý thực tế
- Luôn dùng
try/finallyhoặcwithđể đảm bảo close(). - TCP: stream-based, cần framing (length prefix, delimiter).
- UDP: datagram, không đảm bảo thứ tự/đến hạn.
- Production: dùng
asyncio,socketserver, hoặc framework (FastAPI, Django Channels).