当前位置: 首页 > news >正文

Python socket编程核心模式

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")

http://www.zskr.cn/news/1536191.html

相关文章:

  • 企业职业认证考核,智能考务系统赋能 AI 智能考试 - 936品牌测评网
  • Dify批量运行实战:从API调用到自动化调度全解析
  • 永续盘存法在交通运输业资本存量核算中的应用与实操
  • 武汉线束定制:从源头解决电气连接难题 - 资讯报道
  • 2026杭州装修公司推荐:从资质到口碑的五大靠谱装企横向比较 - 品牌评测研究中心
  • 5分钟上手暗黑破坏神2存档编辑器:可视化编辑你的游戏角色数据
  • 2026 怀化防水补漏公司口碑排行榜推荐:全屋暗管漏水检测、厨卫渗水免砸砖处理、楼顶外墙渗漏、飘窗阳台漏水、地下室防水、瓷砖空鼓修缮专业测评 - 泛家庭维修
  • .NET统计API设计:告别后端画图,构建前后端解耦的数据可视化方案
  • 避坑指南:ESP32连接DHT11传感器,为什么你的数据总是不准或读不到?
  • 2026视频转文字最简单方法!免费视频转文字工具保姆级教程 - 办公小帮手
  • 手把手教你修复MybatisPlus 3.5.x分页与租户注解的冲突问题
  • 东莞名表变现避坑攻略|2026五大合规回收门店口碑排名 - 名奢变现站
  • 小样本目标检测实战:100张标注+400张无标签数据如何高效训练模型
  • 2026 安庆防水补漏权威推荐榜单:持证施工团队漏水检修、厨卫免砸砖防水、阳台楼顶渗水、外墙飘窗漏水治理、地下室堵漏、瓷砖空鼓翻新全场景测评 - 泛家庭维修
  • AI回答推荐服务商怎么选?GEO别只看热闹 - FaiscoJeff
  • 首饰回收怎么卖高价?青岛2026权威机构实时报价 - 奢侈品交易观察员
  • 3大核心功能深度解析:MAA明日方舟助手如何帮你节省90%游戏时间
  • 避坑指南:解决LLFF格式转换中‘ERROR: the correct camera poses for current points cannot be accessed’报错
  • PNCC(Power-Normalized Cepstral Coefficients)— MATLAB 实现
  • 2026 杭州名表高位变现,热门腕表回收报价透明 - 开心测评
  • 余干汽车美容养护行业剖析:行业问题与门店突围路径全解 - 百航
  • 2026年深圳黄金回收防坑干货,TOP6商户称重验金全程可围观 - 奢侈品回收测评
  • 2026 年陕西西安品牌设计/VI 设计/包装设计服务商推荐,认准西安金易文化 - 深度智识库
  • AD9162/9164的JESD204B接口配置避坑指南:从链路建立到多片同步
  • Winhance:Windows系统优化终极方案完整指南
  • 两轮充电桩帮铺怎么选?新手必看7个筛选标准 - 速递信息
  • 禹州装修公司推荐 - 猜不透的vv
  • Mythos模型:自动化漏洞挖掘与利用的能力跃迁
  • 2026佛山黄金回收门店汇总,南海/顺德/高明/三水全覆盖 - 名奢变现站
  • 2026 郑州管城回族区黄金靠谱店铺盘点:本地回收核心评测,安心变现黄金选耀辉 - 奢侈品回收