Python socket编程核心模式
socket是网络通信的基础抽象。Python的socket模块直接封装了伯克利套接字API。
创建TCP服务器:
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('localhost', 8888))
server.listen(5)
def handle_client(conn):
data = conn.recv(1024)
conn.send(data) # echo
conn.close()
while True:
conn, addr = server.accept()
handle_client(conn)
TCP服务器创建过程:socket -> bind -> listen -> accept循环。
创建TCP客户端:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 8888))
client.send(b'Hello')
response = client.recv(1024)
client.close()
TCP客户端:socket -> connect -> send/recv -> close。
UDP服务器:
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('localhost', 9999))
data, addr = server.recvfrom(1024)
server.sendto(b'Reply', addr)
UDP无连接。recvfrom返回数据和地址,sendto发送到指定地址。
非阻塞IO:
server.setblocking(False)
server.settimeout(5.0) # 或设置超时
try:
conn, addr = server.accept()
except socket.timeout:
print("No connection within 5 seconds")
setblocking(False)使所有操作立即返回(可能抛出BlockingIOError)。settimeout设置超时值。
selectors模块的多路复用:
import selectors
import socket
sel = selectors.DefaultSelector()
server = socket.socket()
server.bind(('localhost', 8888))
server.listen(100)
server.setblocking(False)
sel.register(server, selectors.EVENT_READ, data='accept')
while True:
events = sel.select(timeout=None)
for key, mask in events:
if key.data == 'accept':
conn, addr = key.fileobj.accept()
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, data='echo')
else:
data = key.fileobj.recv(1024)
if data:
key.fileobj.send(data)
else:
sel.unregister(key.fileobj)
key.fileobj.close()
selectors模块封装了select/poll/epoll的差异。使用统一的接口处理IO事件。
sendall保证完整发送:
data = b'x' * 100000
sent = client.send(data) # 可能只发送部分数据
client.sendall(data) # 直到全部发送完成
sendall循环调用send直到数据全部发送或出错。
套接字选项:
import socket
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536)
s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)
SO_REUSEADDR允许地址重用。TCP_NODELAY禁用Nagle算法。SO_KEEPALIVE启用心跳。
getsockopt查看当前选项值:
bufsize = s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
print(f"Send buffer: {bufsize}")
套接字超时异常处理:
import socket
s = socket.socket()
s.settimeout(2.0)
try:
s.connect(('192.168.1.1', 80))
except socket.timeout:
print("Connection timed out")
except ConnectionRefusedError:
print("Connection refused")
except OSError as e:
print(f"Socket error: {e}")
finally:
s.close()
socket.gethostbyname域名解析:
ip = socket.gethostbyname('example.com')
print(f"IP: {ip}")
hostname, aliases, addresses = socket.gethostbyaddr(ip)
print(f"Hostname: {hostname}")
getaddrinfo返回地址信息列表:
info = socket.getaddrinfo('example.com', 80, socket.AF_INET, socket.SOCK_STREAM)
for family, type, proto, canonname, sockaddr in info:
print(f"Family: {family}, Type: {type}, Addr: {sockaddr}")
创建原始套接字(需要root权限):
try:
raw = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
raw.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
except PermissionError:
print("Raw sockets require root/admin")
Python socket编程核心模式
张小明
前端开发工程师
如何用Obsidian Outliner实现高效列表管理与思维组织自动化
如何用Obsidian Outliner实现高效列表管理与思维组织自动化 【免费下载链接】obsidian-outliner Work with your lists like in Workflowy or RoamResearch 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-outliner Obsidian Outliner是一款专为Obsidian笔记软件…
BiliTools终极指南:跨平台哔哩哔哩工具箱全面解析
BiliTools终极指南:跨平台哔哩哔哩工具箱全面解析 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliT…
7种策略深度解析SGLang高性能部署架构设计:从系统架构到性能调优的最佳实践
7种策略深度解析SGLang高性能部署架构设计:从系统架构到性能调优的最佳实践 【免费下载链接】sglang SGLang is a high-performance serving framework for large language models and multimodal models. 项目地址: https://gitcode.com/GitHub_Trending/sg/sgla…
豆包2026实战指南:从工具到协作者操作系统的深度转型
1. 这不是一份“说明书”,而是一份豆包深度使用者的实战笔记“豆包使用手册(2026完整版)”——看到这个标题,你可能下意识点开想查某个按钮在哪、怎么调参数、为什么回复变慢了。但我要先说清楚:这份内容不是官方文档的…
Ruby‘s Louvre:IE时代前端响应式思想的源头
1. 项目概述:一个被严重误读的前端技术符号“Rubys Louvre”——这五个单词组合在一起,乍看像某位艺术家的个人画廊、巴黎左岸一家小众咖啡馆,或是某本冷门小说的章节标题。但如果你在2010年前后的中文前端技术社区里泡过论坛、翻过博客、下载…
3分钟极速汉化:FigmaCN中文插件完整使用指南
3分钟极速汉化:FigmaCN中文插件完整使用指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否曾因Figma的英文界面而困扰?面对"Component"、&quo…