Python 的 socket 模块是构建网络通信程序的基础库之一,提供了对底层 BSD 套接字(Socket)接口的封装,使开发者能方便地构建客户端与服务器,实现 TCP、UDP 等协议的数据通信。
常见应用场景:
(1)构建 TCP 服务器或客户端,实现双向通信。
(2)构建 UDP 服务器或客户端,适合无连接快速通信。
(3)远程控制、即时聊天、在线游戏、数据采集等场景。
(4)构建底层 HTTP、FTP、SMTP 等协议的自定义实现。
(5)网络工具开发,如端口扫描器、Ping 模拟器等。
◆ ◆ ◆
核心概念
1、Socket(套接字) 是网络通信的端点,由 IP 地址和端口号唯一确定。
2、套接字分为流式套接字(TCP)和数据报套接字(UDP)。
3、Python 中使用 socket.socket() 创建一个套接字对象,指定地址簇(如 IPv4)和类型(TCP 或 UDP)。
4、服务器端使用 bind()、listen()、accept() 接收连接;客户端使用 connect() 建立连接。
5、数据的收发通过 send() / recv()(TCP)或 sendto() / recvfrom()(UDP)完成。
◆ ◆ ◆
应用举例
例 1:创建 TCP 服务器(接收连接并回送消息)
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind(("localhost", 8000))server.listen()
print("等待连接中...")conn, addr = server.accept()print("连接来自:", addr)
data = conn.recv(1024)print("收到:", data.decode())
conn.sendall(b"Hello, Client!")conn.close()
说明:
编码完成后,保存文件如 server_tcp.py。然后在命令行中运行以启动本地 TCP 服务器。
python server_tcp.py
例 2:创建 TCP 客户端(连接服务器并发送消息)
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(("localhost", 8000))client.sendall(b"Hello, Server!")response = client.recv(1024)print("服务器回复:", response.decode())client.close()
例 3:创建 UDP 服务器(接收并回复)
import socket
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_server.bind(("localhost", 9000))
print("UDP 服务器等待消息...")data, addr = udp_server.recvfrom(1024)print("来自", addr, "的数据:", data.decode())
udp_server.sendto(b"Pong", addr)udp_server.close()
例 4:创建 UDP 客户端(无需连接,直接发送)
import socket
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_client.sendto(b"Ping", ("localhost", 9000))data, addr = udp_client.recvfrom(1024)print("收到回复:", data.decode())udp_client.close()
例 5:获取本机主机名与 IP 地址
import socket
hostname = socket.gethostname()ip_address = socket.gethostbyname(hostname)
print("主机名:", hostname)print("IP 地址:", ip_address)
◆ ◆ ◆
常用函数速览
socket.accept()
用于 TCP 服务器中,接收客户端的连接请求。
参数:无(但需在 listen() 后使用)
返回:
返回 (conn, address) 元组,其中 conn 是与客户端通信的新 socket 对象,address 是客户端地址(IP, port)
socket.bind(address)
将 socket 绑定到本地地址和端口,通常用于服务器端。
参数:
address:元组 (host, port),如 ("localhost", 8080)
返回:无
socket.close()
关闭 socket 连接,释放资源。
参数:无
返回:无
socket.connect(address)
用于客户端 socket,连接到服务器端。
参数:
address:元组 (host, port),如 ("example.com", 80)
返回:无
socket.gethostbyname(hostname)
将主机名解析为 IPv4 地址。
参数:
hostname:主机名字符串,如 "localhost" 或 "www.example.com"
返回:字符串 IP 地址,如 "127.0.0.1"
socket.gethostname()
获取当前设备的主机名。
参数:无
返回:字符串主机名,如 "My-PC"
socket.listen(backlog)
设置 TCP socket 为监听模式,准备接收连接。
参数:
backlog:连接队列的最大长度(如 5)
返回:无
socket.recv(bufsize)
从已连接的 TCP socket 中接收数据。
参数:
bufsize:最大接收的字节数(如 1024)
返回:接收到的字节数据 bytes 类型
socket.recvfrom(bufsize)
从 UDP socket 中接收数据和发送方地址。
参数:
bufsize:最大接收字节数(如 1024)
返回:
元组 (data, address)
data:接收到的字节数据
address:发送方的地址元组 (ip, port)
socket.send(data)
向 TCP 连接发送数据。
参数:
data:字节类型的数据(bytes)
返回:实际发送的字节数
socket.sendto(data, address)
通过 UDP socket 向指定地址发送数据。
参数:
data:字节类型的数据
address:目标地址元组 (host, port)
返回:实际发送的字节数
socket.settimeout(timeout)
为 socket 操作设置超时时间(秒)。
参数:
timeout:超时时间(浮点数,如 5.0 秒)
返回:无
socket.socket(family=AF_INET, type=SOCK_STREAM)
创建一个 socket 对象。
参数:
family:地址族,如 AF_INET(IPv4)或 AF_INET6
type:协议类型,如 SOCK_STREAM(TCP)或 SOCK_DGRAM(UDP)
返回:socket 对象实例
◆ ◆ ◆
补充说明
1、socket 是构建自定义网络协议的核心模块。
2、实际网络编程时,应考虑异常处理、超时机制(如 settimeout())。
3、发送的数据建议为 bytes 类型,文本请先 .encode()。
4、如果需求更复杂,可考虑使用 asyncio 或 select 进行并发处理。
5、若需构建 HTTP 等协议的客户端,推荐使用高级库如 requests 或 http.client。
“点赞有美意,赞赏是鼓励”