讲师中心 微信公众号
AI工具推荐 视频效率加速

Python TCP 服务端的正确实现姿势

冬静吖_4650

冬静吖_4650

发布时间:2026-02-24 20:15:10

|

1013人浏览过

|

来源于php中文网

原创

socket.accept()需用try/except捕获OSError(errno 4)并重试;recv()返回b''表示连接关闭,须显式判断;多客户端应避免单线程轮询,改用I/O多路复用、多线程或asyncio;bind()前须设SO_REUSEADDR。

python tcp 服务端的正确实现姿势

socket.accept() 必须在 try/except 里包裹

阻塞式 accept() 可能被信号中断(比如 Ctrl+C、系统发送的 SIGCHLD),此时会抛出 OSError: [Errno 4] Interrupted system call。不捕获就崩,尤其在 Linux 守护进程中很常见。

  • 用 try/except OSError as e: 捕获,检查 e.errno == 4 后直接重试 accept()
  • 别只捕获 socket.error(Python 3 已弃用)或宽泛的 Exception
  • 如果用了 signal.signal(signal.SIGINT, handler),更要小心——自定义信号处理会让 accept() 更容易被中断

recv() 返回空字节意味着客户端已关闭连接

recv() 返回 b'' 不是错误,而是 TCP 连接被对方正常关闭(FIN 包到达)。很多新手误以为是网络故障,接着继续 recv() 或忽略,结果导致死循环或资源泄漏。

  • 每次 recv() 后必须显式判断:if not data: break
  • 不要依赖超时来“等数据”,recv() 在连接关闭时立刻返回空,不等超时
  • 若协议需要粘包处理(如自定义消息头),也要先确认连接是否还活着,再解析;否则可能对 b'' 做解包,触发 struct.unpack() 报错

多客户端场景下别用单线程轮询 recv()

一个线程里对多个 socket 调用 recv() 是典型阻塞陷阱:只要一个客户端不发数据,整个服务就卡住,其他连接全被饿死。

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
  • 要么用 select() / poll() / epoll() 做 I/O 多路复用(注意 Windows 下 select() 是唯一通用选项)
  • 要么用 threading.Thread 为每个连接启一个线程(适合低并发,注意 threading.stack_size() 和 GIL 影响)
  • 要么用 asyncio + async def handle_client()(推荐,但得确保所有 I/O 都是 async 的,别混用 time.sleep() 或同步 DB 调用)

bind() 前记得 setsockopt(SO_REUSEADDR)

服务重启时经常报 OSError: [Errno 98] Address already in use,本质是 TIME_WAIT 状态占着端口。不设 SO_REUSEADDR,内核拒绝绑定。

立即学习“Python免费学习笔记(深入)”;

  • 必须在 bind() 前调用:s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  • Windows 和 Linux 都支持,无需条件判断
  • 别和 SO_REUSEPORT 混淆——后者是 Linux 3.9+ 才有,用于多进程负载均衡,普通服务端不需要

真正难的不是写通连接,而是让 accept() 不崩、recv() 不卡、多连接不互掐、重启不失败。这些点漏掉任何一个,上线后都得半夜爬起来看日志。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1049

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3340

2023.10.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3160

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

847

2025.10.24

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4658

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1309

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

443

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

579

2026.01.21

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn