【网络】Python 怎么做TCP通讯

在 Python 中,TCP 通信核心依赖标准库 (无需额外安装),分为底层原生类高层简化类异步高性能类三层,上手成本极低。

新手优先 → 进阶高性能的顺序整理,附核心类、用途和极简示例:


一、Python TCP 通信核心库(标准库,必学)

1. 底层核心:socket 模块(万能基础)

对应 C# 的 Socket 基类,所有 Python TCP 通信的底层实现,原生支持 TCP/UDP,灵活通用,是最基础的选择。

核心类/对象

  • socket.socket(family=AF_INET, type=SOCK_STREAM)
    • AF_INET:IPv4 协议(家用/通用)
    • SOCK_STREAM:指定 TCP 协议

角色分工

用法 角色 核心方法
bind() / listen() / accept() 服务端 监听端口、接受客户端连接
connect() 客户端 主动连接服务端
recv() / send() 通用 收发字节数据

2. 高层简化:socketserver 模块(快速写服务端)

对应 C# 的 TcpListener官方封装好的高层类 ,屏蔽底层细节,一键实现多线程/多进程 TCP 服务端,新手写服务端首选。

核心类

类名 作用 推荐度
TCPServer 基础单线程 TCP 服务端 ⭐⭐
ThreadingTCPServer 多线程 TCP 服务端(支持多客户端同时连接,家用最常用) ⭐⭐⭐⭐⭐
ForkingTCPServer 多进程 TCP 服务端(Linux 专用) ⭐⭐
BaseRequestHandler 自定义数据处理逻辑(必须继承重写) 核心

3. 现代高性能:asyncio 模块(异步 TCP)

对应 C# 的 System.IO.Pipelines/异步模型,Python 官方推荐的高并发方案,无阻塞、高吞吐,适合物联网、消息推送等场景。

核心类/函数

  • asyncio.start_server():创建异步 TCP 服务端
  • asyncio.open_connection():创建异步 TCP 客户端
  • StreamReader / StreamWriter:异步读写数据流

二、第三方进阶库(大型项目用)

  1. Twisted:老牌重量级异步网络框架,工业级 TCP 服务端
  2. gevent:协程 TCP,低开销高并发
  3. ZeroMQ:高级封装 TCP,简化消息通信

新手只用标准库就足够,第三方库无需一开始学习。


三、极简代码示例(直接复制运行)

1. 基础版:socket 实现 TCP(客户端+服务端)

服务端

python 复制代码
import socket

# 创建TCP服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 8888))  # 绑定IP端口
server.listen(5)  # 监听连接
print("服务端启动,等待客户端...")

# 接受连接
conn, addr = server.accept()
print(f"客户端已连接:{addr}")

# 收发数据
data = conn.recv(1024)  # 接收数据
print(f"收到:{data.decode('utf-8')}")
conn.send(b"Server received")  # 回复数据

# 关闭
conn.close()
server.close()

客户端

python 复制代码
import socket

# 创建TCP客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 8888))  # 连接服务端

# 收发数据
client.send(b"Hello TCP Server")
data = client.recv(1024)
print(f"收到回复:{data.decode('utf-8')}")

client.close()

2. 推荐版:socketserver 多线程 TCP 服务端

支持多个客户端同时连接,家用/小项目最优解:

python 复制代码
from socketserver import BaseRequestHandler, ThreadingTCPServer

# 自定义处理类
class Handler(BaseRequestHandler):
    # 处理客户端数据
    def handle(self):
        print(f"新连接:{self.client_address}")
        # 接收数据
        data = self.request.recv(1024)
        print(f"收到:{data.decode()}")
        # 回复
        self.request.send(b"Multi-thread TCP Server OK")

# 启动多线程服务端
if __name__ == '__main__':
    server = ThreadingTCPServer(("127.0.0.1", 8888), Handler)
    print("多线程TCP服务端启动")
    server.serve_forever()

四、快速选型指南(对应你的需求)

  1. 简单通讯、小工具socket 模块(最通用)
  2. 家用服务端、多客户端连接socketserver.ThreadingTCPServer(首选,对应 C# TcpListener)
  3. 高并发、物联网、现代项目asyncio 异步 TCP
  4. 大型工业级服务 → Twisted

补充关键知识点

  1. TCP 粘包:和 C# 一样,TCP 是流协议,会出现粘包,需要自定义数据格式(加长度头/分隔符)解决;
  2. 编码 :TCP 只能收发字节数据(bytes) ,字符串必须用 encode()/decode() 转换;
  3. 全平台:Windows/Linux/macOS 代码完全通用。

总结

  1. 新手首选socketserver.ThreadingTCPServer(高层封装,省心)
  2. 底层灵活socket.socket()
  3. 高并发asyncio 异步 TCP
相关推荐
ILYT NCTR2 小时前
爬虫学习案例3
爬虫·python·学习
Greyson12 小时前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
23471021272 小时前
4.16 学习笔记
开发语言·软件测试·python
2401_883600252 小时前
Redis如何查询特定用户的排名_利用ZREVRANK指令获取ZSet降序名次
jvm·数据库·python
2301_777599372 小时前
如何决定是否需要创建索引_数据区分度与基数Cardinality计算
jvm·数据库·python
m0_514520572 小时前
SQL在SQL存储过程中优化子查询_缓存中间结果减少开销
jvm·数据库·python
裕工实验室2 小时前
功率模块为什么一定要用陶瓷PCB?从结构到选材一篇讲清(附DPC / DBC / AMB选型逻辑)
网络·硬件工程·pcb工艺·材料工程
21439652 小时前
JavaScript中剩余参数在函数签名中的定义位置与限制
jvm·数据库·python
2301_815279523 小时前
CSS定位如何实现多行文字垂直居中_通过绝对定位模拟表格
jvm·数据库·python