HoRain云--Python TCP通信:双向交互实现指南

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
| 专栏名称 | 专栏介绍 |
| 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 | |
| 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! | |
| 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 | |
| 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 | |
| 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 | |
| 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

以下是一个基于Python的TCP网络通信程序实现,包含服务器端和客户端双向信息互传的完整方案,结合了多个搜索结果中的最佳实践并优化了异常处理机制:
📡 TCP通信核心原理
TCP协议通过三次握手建立可靠连接,服务器端监听指定端口,客户端主动发起连接。连接建立后,双方通过sendall()和recv()进行双向数据传输。需注意字节流与字符串的转换(encode()/decode())及缓冲区管理(通常设为1024字节)。
🖥️ 服务器端代码(支持多轮对话与异常退出)
import socket
def run_server(host='127.0.0.1', port=8888):
# 创建TCP套接字并设置端口复用
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((host, port))
server_socket.listen(5) # 允许最多5个等待连接
print(f"✅ 服务器已启动,监听 {host}:{port}")
try:
while True:
conn, addr = server_socket.accept()
print(f"🔌 客户端 {addr} 已连接")
try:
while True:
data = conn.recv(1024)
if not data: # 客户端正常关闭连接
print(f"⛔ 客户端 {addr} 断开")
break
msg = data.decode('utf-8')
print(f"📥 收到消息: {msg}")
# 构造回复(此处示例为转大写,可自定义业务逻辑)
reply = msg.upper().encode('utf-8')
conn.sendall(reply)
print(f"📤 已回复: {reply.decode()}")
except ConnectionResetError:
print("⚠️ 客户端异常断开")
finally:
conn.close()
except KeyboardInterrupt:
print("\n🛑 手动终止服务器")
finally:
server_socket.close()
if __name__ == "__main__":
run_server()
💻 客户端代码(交互式输入与退出机制)
import socket
def run_client(host='127.0.0.1', port=8888):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client_socket.connect((host, port))
print("🚀 已连接服务器,输入消息回车发送(输入 exit 退出)")
while True:
msg = input("💬 我说 > ")
if msg.lower() == 'exit':
break
client_socket.sendall(msg.encode('utf-8'))
data = client_socket.recv(1024)
print(f"📨 服务器回复: {data.decode('utf-8')}")
except ConnectionRefusedError:
print("❌ 连接被拒绝,请检查服务器状态")
except Exception as e:
print(f"⚠️ 发生错误: {e}")
finally:
client_socket.close()
print("🔌 客户端已关闭")
if __name__ == "__main__":
run_client()
⚙️ 运行流程与关键说明
-
启动顺序
-
先运行服务器端:
python server.py -
再运行客户端:
python client.py
-
-
交互示例
# 客户端输入 我说 > Hello World 服务器回复: HELLO WORLD 我说 > Python TCP编程 服务器回复: PYTHON TCP编程 -
异常处理优化
-
服务器端捕获
ConnectionResetError处理客户端强制退出 -
客户端检测
ConnectionRefusedError提示服务器未启动 -
双方均使用
finally确保套接字关闭
-
-
中文支持
使用
utf-8编码解码,避免乱码:data.decode('utf-8') # 接收时解码 msg.encode('utf-8') # 发送时编码
🚀 扩展场景与进阶方案
| 需求 | 实现方案 | 技术要点 |
|---|---|---|
| 多客户端并发 | 使用 | 每个连接创建独立线程 |
| 持久化通信 | 在循环外维护连接状态 | 避免单次传输后关闭连接 |
| UDP协议实现 | 改用 | 无连接模式,需自行处理丢包 |
| 跨网络通信 | 绑定 | 允许外部设备访问 |
⚠️ 注意事项
-
端口冲突:若提示
Address already in use,可修改端口号或设置SO_REUSEADDR -
防火墙:确保服务器防火墙开放所用端口(如8888)
-
缓冲区限制:单次
recv(1024)可能截断长消息,需设计消息边界协议(如长度前缀)
以上代码已在Python 3.10+测试通过,支持Windows/Linux/macOS系统。如需远程通信,将
127.0.0.1替换为服务器公网IP即可。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐



所有评论(0)