Python3 网络编程
网络编程让不同进程甚至不同机器交换数据。Python 标准库 socket 直接封装了操作系统的网络接口,聊天室、文件传输、自定义协议服务端等底层网络应用都从它开始。
网络基础:IP、端口与 TCP/UDP
| 概念 | 说明 |
|---|---|
| IP 地址 | 标识一台主机,如 127.0.0.1(本机回环地址) |
| 端口 | 0~65535,标识主机上的某个服务,如 80、443 |
| TCP | 面向连接、可靠,先建立连接再传数据(HTTP 基于它) |
| UDP | 无连接、不可靠但更快,适合视频通话、DNS 等 |
TCP 客户端:socket → connect → send → recv
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 TCP 套接字
s.connect(("127.0.0.1", 8000)) # 连接本机 8000 端口
s.sendall("你好,服务器".encode()) # 发送数据
data = s.recv(1024) # 接收最多 1024 字节
print(data.decode()) # 输出:你好,客户端
s.close()
流程四步:socket() 建套接字 → connect() 建立连接 → sendall/recv 收发数据 → close() 关闭。
TCP 服务端:socket → bind → listen → accept
服务端先启动监听,accept 阻塞等待客户端连入。下面的服务端与上面的客户端配合,形成一问一答的简单对话:
import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(("127.0.0.1", 8000)) # 绑定地址与端口
srv.listen(5) # 开始监听,最多 5 个连接排队
print("等待连接...")
conn, addr = srv.accept() # 阻塞等待一个客户端连入
print("客户端地址:", addr) # 输出:客户端地址: ('127.0.0.1', 端口)
msg = conn.recv(1024).decode()
print("收到:", msg) # 输出:收到: 你好,服务器
conn.sendall("你好,客户端".encode())
conn.close() # 结束本次会话
srv.close()
运行方式:先在一个终端启动服务端,再另开终端运行客户端,即可看到双方消息;若想持续服务,把 accept 之后的部分放进 while True 循环即可。
UDP:无连接收发
import socket
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP 套接字
udp.sendto(b"ping", ("127.0.0.1", 9000)) # 无需连接,直接发送
data, addr = udp.recvfrom(1024) # 接收并带上来源地址
print(addr, data)
# 输出:(('127.0.0.1', 9000), b'ping') (需先有对端监听 9000 端口)
UDP 没有 connect/accept,只有 sendto/recvfrom;速度快但不保证送达与顺序。
常见异常处理
网络随时可能失败(对方未启动、超时、断线),关键位置要捕获异常:
import socket
s = None
try:
s = socket.create_connection(("127.0.0.1", 8000), timeout=3)
s.sendall(b"hi")
print("连接成功")
except (socket.timeout, ConnectionRefusedError) as e:
print("连接失败:", e) # 输出:连接失败:...(服务端未启动时触发)
finally:
if s:
s.close()
小结:TCP 走 connect/bind/listen/accept 四步建立可靠连接,UDP 用 sendto/recvfrom 即发即收;收发数据注意编解码(encode/decode),并记得 close 与捕获异常。