Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lập trình Socket trong Python

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

MethodMô 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/finally hoặc with để đả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).