当前位置: 首页 > 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.jsqmd.com/news/1024326/

相关文章:

  • 企业职业认证考核,智能考务系统赋能 AI 智能考试 - 936品牌测评网
  • 2026年贵阳高考志愿填报咨询机构深度评测:从分数至上到就业导向的升学规划革命 - 优质企业观察收录
  • 2026湖州婚纱礼服馆实测:5家口碑品牌甑选 - 江湖评测
  • 3大核心技术深度解析:如何通过逆向工程实现《鸣潮》游戏模组定制
  • Dify批量运行实战:从API调用到自动化调度全解析
  • 海口江东新区8家回收横评,紫罗兰翡翠结算速度比拼 - 逸程
  • 永续盘存法在交通运输业资本存量核算中的应用与实操
  • 武汉线束定制:从源头解决电气连接难题 - 资讯报道
  • 2026杭州装修公司推荐:从资质到口碑的五大靠谱装企横向比较 - 品牌评测研究中心
  • 5分钟上手暗黑破坏神2存档编辑器:可视化编辑你的游戏角色数据
  • 城关区豪兴宇:深耕西北二十余年的专业户外用品供应商 - 奔跑123
  • 2026年郑州泳池温泉水处理设备厂家推荐:5大品牌深度横评与选购指南 - 年度推荐企业名录
  • MSC8112 DSI接口配置与调试实战:从原理到性能优化
  • ControlNet-v1-1 FP16架构设计:Stable Diffusion 1.5高性能控制网络优化实战
  • .NET统计API设计:告别后端画图,构建前后端解耦的数据可视化方案
  • BiliTools终极指南:跨平台哔哩哔哩工具箱全面解析
  • 2026 怀化防水补漏公司口碑排行榜推荐:全屋暗管漏水检测、厨卫渗水免砸砖处理、楼顶外墙渗漏、飘窗阳台漏水、地下室防水、瓷砖空鼓修缮专业测评 - 泛家庭维修
  • 2026保姆级指南:录音转文字软件教程,免费在线/电脑手机专业工具全覆盖 - 办公小帮手
  • 猫抓浏览器扩展:终极免费资源嗅探工具,轻松下载网页媒体资源
  • 避坑指南:ESP32连接DHT11传感器,为什么你的数据总是不准或读不到?
  • Java企业级ReAct Agent架构设计:从Demo到生产落地
  • 2026佛山奢侈品手表回收测评:添价收奢侈品回收圈内公认的王者 - 薛定谔的梨花猫
  • 技术博客系统设计:静态站点+原子笔记+可扩展架构
  • 2026义乌企业税务合规与税负优化服务深度评测:思凯财税的差异化价值与选型逻辑 - 企业品牌优选测评官
  • 金融数据分析避坑指南:Windpy调用EDB数据库时常见的5个错误及解决方法
  • 建筑陶瓷外墙装饰的工艺革新:紫砂陶土如何重塑行业标准 - 资讯报道
  • 2026 福建漳州市全区域|彩钢瓦翻新 / 防水补漏 / 除锈喷漆修缮公司 TOP4 权威推荐 + 避坑指南 - 本地便民网
  • 2026年青岛装修公司哪家好?五维评估法帮你找到靠谱的整装品牌 - 品牌评测研究中心
  • 2026视频转文字最简单方法!免费视频转文字工具保姆级教程 - 办公小帮手
  • 轻量级Android键盘新选择:为什么你需要尝试Simple Keyboard?