Python 实现基于 TCP 的聊天程序(Socket + threading + Tkinter + 4 节点并行)
Python 实现基于 TCP 的聊天程序Socket threading Tkinter 4 节点并行本文配套实验TCP/IP 协议基础、Python 网络编程、Socket 编程、threading 多线程、Tkinter 图形界面。在华为云 FlexusX 4 节点上完成分布式聊天实测。完整源码与运行产物见文末仓库地址Gitee。一、实验目标理解TCP/IP的面向连接、可靠字节流传输模型。掌握Python Socket服务端listen/accept与客户端connect编程。掌握threading多线程服务器为每个客户端连接单独开一个线程实现并发。掌握Tkinter图形界面聊天室 GUI并在后台线程中接收网络消息避免界面卡死。在4 台服务器上并行运行、互通测试验证真实网络环境下的聊天功能。二、TCP/IP 与 Socket 核心概念1. TCP 三次握手与可靠传输TCP 是面向连接的协议。客户端与服务端通信前要先完成三次握手建立一条可靠字节流通道。连接建立后发送的数据会按顺序、无差错地到达对端除非网络断开。2. Python Socket 编程模型服务端importsocket srvsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# TCPsrv.bind((0.0.0.0,9000))# 绑定本机所有网卡的 9000 端口srv.listen(64)# 监听最大挂起连接数 64conn,addrsrv.accept()# 阻塞等待客户端连接客户端clientsocket.socket(socket.AF_INET,socket.SOCK_STREAM)client.connect((服务器IP,9000))# 主动发起连接client.sendall(bhello\n)3. 为什么需要多线程服务端如果只用一个线程会陷入处理 A 客户端 → B 客户端发消息也读不到的困境。正确做法是每 accept 一个连接就创建一个threading.Thread每个线程独立和它的客户端收发主线程继续 accept 下一个连接。三、聊天室协议设计教学版为了简单、可读本实验采用文本行协议每条消息以\n结尾客户端连接后第一条消息作为昵称。后续每行都是聊天内容。服务器把任意客户端消息以 JSON 广播给所有人{type:chat,from:昵称,msg:内容}上下线由服务器自动广播系统消息{type:system,from:系统,msg:XXX 加入了聊天室}工业上通常会用二进制长度头/Protocol Buffers但教学演示用文本行最清晰。四、聊天服务器多线程广播chat_server.py核心逻辑监听0.0.0.0:9000。维护在线客户端列表clients用锁clients_lock保护线程安全。accept到新连接后创建Thread(targethandle_client)。handle_client先读取昵称然后循环接收每行消息调用broadcast把 JSON 发给所有在线客户端。importsocket,threading,json clients[]clients_lockthreading.Lock()defbroadcast(obj):data(json.dumps(obj,ensure_asciiFalse)\n).encode(utf-8)withclients_lock:forconn,addr,nameinclients:try:conn.sendall(data)exceptException:passdefhandle_client(conn,addr):nameconn.recv(1024).decode(utf-8).strip()# 首条为昵称withclients_lock:clients.append((conn,addr,name))broadcast({type:system,from:系统,msg:f{name}加入了聊天室})whileTrue:dataconn.recv(4096)ifnotdata:break# 按行解析、广播...五、控制台客户端脚本化并行测试chat_client.py控制台客户端用于在headless服务器上批量验证。用法python3 chat_client.py服务器IP端口昵称消息1|消息2消息间隔关键实现主线程连接 发送消息。接收线程recv_loop持续读取广播避免阻塞发送。importsocket,threading,timedefrecv_loop(sock):whileTrue:datasock.recv(4096)ifnotdata:break# 解析 JSON 并打印socksocket.socket(AF_INET,SOCK_STREAM)sock.connect((SERVER,PORT))threading.Thread(targetrecv_loop,args(sock,),daemonTrue).start()六、Tkinter GUI 客户端chat_gui.pyGUI 客户端体现用 Tkinter 库编写聊天程序 GUI 模块。界面组成顶部服务器 IP / 端口 / 昵称输入框 连接/断开按钮。中部ScrolledText消息显示区只读。底部消息输入框 发送按钮支持回车发送。关键点GUI 的接收必须放到独立线程# 连接成功后启动接收线程threading.Thread(targetself.recv_loop,daemonTrue).start()如果直接在主线程recv()界面会冻结按钮点不动。recv_loop收到消息后用self.root.after(0, lambda: ...)或self.append_text线程安全地更新界面。真实运行截图在华为云ecs-a16b-0002上通过xvfb虚拟显示运行 GUI 客户端连接服务器114.116.249.146:9000自动发送消息后截屏可以看到已连接到服务器114.116.249.146:9000系统提示 “GUI节点 加入了聊天室”GUI 端发消息你好我是 Tkinter GUI 客户端 ✅并被服务器广播回显这证明 GUI 客户端不仅界面正常而且能真实收发 TCP 消息。七、4 节点并行实战华为云 FlexusX部署架构节点角色连接目标ecs-a16b-0001 (114.116.249.146)聊天服务器 1 个本机客户端127.0.0.1:9000ecs-a16b-0002 (124.70.93.143)客户端114.116.249.146:9000ecs-a16b-0003 (1.92.74.240)客户端114.116.249.146:9000ecs-a16b-0004 (116.205.116.6)客户端114.116.249.146:9000编排脚本run_chat.py本地用paramiko多线程执行在 0001 启动服务端用setsid脱离会话确保 SSH 断开后服务器仍常驻。4 个客户端并发连接到 0001。拉取服务器日志与各客户端日志合并成transcript.txt。服务器侧日志线程分配证明[MainThread] 聊天服务器已启动监听 0.0.0.0:9000 [Thread-2 (handle_client)] node0001 加入聊天室 (addr(127.0.0.1, 57000))当前在线 1 [Thread-3 (handle_client)] node0002 加入聊天室 (addr(124.70.93.143, 34584))当前在线 2 [Thread-4 (handle_client)] node0004 加入聊天室 (addr(116.205.116.6, 53938))当前在线 3 [Thread-5 (handle_client)] node0003 加入聊天室 (addr(1.92.74.240, 48298))当前在线 4 [Thread-2] node0001: 【0001】TCP 三次握手完成连接已建立 [Thread-3] node0002: 【0002】收到服务器广播在线节点已可见 [Thread-4] node0004: 【0004】聊天室消息被广播给所有人 [Thread-5] node0003: 【0003】GUI 客户端也能接入同一服务器 ... [Thread-2] node0001 断开剩余在线 3 [Thread-3] node0002 断开剩余在线 2 [Thread-4] node0004 断开剩余在线 1 [Thread-5] node0003 断开剩余在线 0每个客户端由独立的 Thread-2~5处理threading并发效果一目了然。客户端侧日志广播效果证明以node0002为例它收到了其他 3 个节点的消息[node0002] 已连接服务器 114.116.249.146:9000 [系统] node0002 加入了聊天室 [来自 node0001] 【0001】TCP 三次握手完成连接已建立 [来自 node0004] 【0004】聊天室消息被广播给所有人 [来自 node0003] 【0003】GUI 客户端也能接入同一服务器 [来自 node0001] 【0001】服务器用 threading 为每客户端开线程 [来自 node0002] 【0002】多客户端互不阻塞 ✅ [来自 node0004] 【0004】4 节点并行测试完成 [来自 node0003] 【0003】Socket 编程真有趣 [系统] node0001 离开了聊天室 [node0002] 测试完成退出4 节点全部成功每个客户端都完整收到了其他节点的消息TCP threading 广播验证通过 ✅。踩坑记录pkill -f chat_server.py自匹配自杀-f按整条命令行匹配启动 chat_server 的 shell 命令行里就含有chat_server.py结果把启动自己的 shell 杀了服务器根本起不来。改按端口杀进程解决。nohup进程被 SSH 会话关闭paramiko 执行nohup ... 并关闭通道后进程可能仍被信号终止。改用setsid创建新会话彻底脱离原会话。服务器就绪探测从本机做本地沙箱到云服务器 9000 端口可能受安全组影响但节点间 9000 实际互通从服务器本机127.0.0.1:9000探测最可靠。八、完整运行示例本地快速体验# 终端1启动服务器python3 chat_server.py9000# 终端2启动客户端 Apython3 chat_client.py127.0.0.19000Alice你好|大家好# 终端3启动客户端 Bpython3 chat_client.py127.0.0.19000Bob收到|Socket 真有趣# 终端4启动图形客户端python3 chat_gui.py4 节点并行部署python3 run_chat.py九、总结TCP 是面向连接的可靠传输三次握手后客户端与服务端建立字节流通道。Python Socket只需socket.socket(AF_INET, SOCK_STREAM)即可实现服务端/客户端。threading 多线程让服务器能同时处理多个客户端每个连接一个线程互不阻塞。Tkinter GUI的接收必须放在后台线程否则界面会卡死。4 台华为云服务器并行验证证明了跨节点 TCP 连接、多线程并发、消息广播均正常工作且 GUI 客户端能真实接入并收发消息。十、源码与产物Gitee 仓库https://gitee.com/LiaCin/python-tcp-chat目录结构python-tcp-chat/ ├── chat_server.py # 多线程 TCP 聊天服务器 ├── chat_client.py # 控制台客户端脚本化测试 ├── chat_gui.py # Tkinter GUI 客户端 ├── run_chat.py # 4 节点 paramiko 并行编排 ├── Python实现基于TCP聊天程序.md # 本博客 ├── README.md ├── gui.png # Xvfb 下 GUI 真实截图 └── results_chat/ ├── transcript.txt # 合并日志4 客户端广播证明 ├── 114.116.249.146/ │ ├── server_log.txt # 服务器侧线程处理日志 │ ├── server_stdout.log │ └── client_node0001.log ├── 124.70.93.143/client_node0002.log ├── 1.92.74.240/client_node0003.log └── 116.205.116.6/client_node0004.log如果本文对你理解 TCP/Socket/threading/Tkinter 有帮助欢迎点赞收藏也欢迎在评论区晒出你的 4 节点运行结果

相关新闻

虚拟机安装与配置

虚拟机安装与配置

查询 Linux 相关职业,例如 Linux 运维工程师,Linux 嵌入式开发工程师的招聘要求 核心技能招聘要求 虚拟化与容器技术:熟悉 VirtualBox、KVM 虚拟化技术,精通 Docker 容器,了解 Kubernetes 基础架构,掌握虚拟…

2026/7/10 23:28:00 阅读更多 →
AI视频生成实战:从直播剪辑到提示词设计的完整流程

AI视频生成实战:从直播剪辑到提示词设计的完整流程

1. 先搞清楚“直播剪辑AIE演讲视频”到底要解决什么问题直播剪辑AIE演讲视频这个需求,听起来像是要把一场直播中的AIE相关演讲内容提取出来,做成精剪视频。但实际落地时,很多人会卡在第一步:到底是要做字幕生成、内容摘要、片段提…

2026/7/10 23:28:00 阅读更多 →
HarmonyOS运动健康——训练计划与动作库页面

HarmonyOS运动健康——训练计划与动作库页面

训练页面是运动健康App的核心功能页。用户从首页点击"开始运动"或某个训练卡片跳转到这里,选择训练计划,浏览动作列表,然后开始训练。这个页面的任务是:展示可用的训练计划,展示每个计划包含的动作&#xff…

2026/7/10 23:26:00 阅读更多 →

最新新闻

AI智能体开发入门:从零到部署的全流程解析

AI智能体开发入门:从零到部署的全流程解析

在近些年当中 , 人工智能技术以飞快的速度向前发展 , 这样的发展态势促使AI智能体变为各个行业在进行数字化转型时非常重要的软件用途。AI智能体指的是那种可以凭借自己主动去觉察环境情况 , 进而得出决策 ,并依照决策做出特定动作来的软件系统 , 它的开发工作涵盖多…

2026/7/11 0:18:16 阅读更多 →
FUXA企业级工业可视化平台架构实战:从零构建现代化SCADA系统

FUXA企业级工业可视化平台架构实战:从零构建现代化SCADA系统

FUXA企业级工业可视化平台架构实战:从零构建现代化SCADA系统 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA 在数字化转型浪潮中,工业企业面临着传统…

2026/7/11 0:18:16 阅读更多 →
探索NxNandManager:Switch NAND数据管理的技术价值与实战指南

探索NxNandManager:Switch NAND数据管理的技术价值与实战指南

探索NxNandManager:Switch NAND数据管理的技术价值与实战指南 【免费下载链接】NxNandManager Nintendo Switch NAND management tool : explore, backup, restore, mount, resize, create emunand, etc. (Windows) 项目地址: https://gitcode.com/gh_mirrors/nx/…

2026/7/11 0:16:16 阅读更多 →
终极PDF解密神器:3分钟永久解除科学文库7天限制的完整指南

终极PDF解密神器:3分钟永久解除科学文库7天限制的完整指南

终极PDF解密神器:3分钟永久解除科学文库7天限制的完整指南 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档,支持破解科学文库、标准全文数据库下载的文档。无损破解,保留文字和目录,解除有效期限制。 项目地址…

2026/7/11 0:14:15 阅读更多 →
苏州大学研究生毕业论文LaTeX模板:云端写作的完美解决方案

苏州大学研究生毕业论文LaTeX模板:云端写作的完美解决方案

苏州大学研究生毕业论文LaTeX模板:云端写作的完美解决方案 【免费下载链接】Soochow-University-Thesis-Overleaf-LaTeX-Template 苏州大学研究生毕业论文Latex模板 - Overleaf 项目地址: https://gitcode.com/gh_mirrors/so/Soochow-University-Thesis-Overleaf-…

2026/7/11 0:14:15 阅读更多 →
终极游戏存档管理方案:Apollo PS4工具完全指南

终极游戏存档管理方案:Apollo PS4工具完全指南

终极游戏存档管理方案:Apollo PS4工具完全指南 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 还在为游戏进度丢失而烦恼?想要体验别人分享的完美存档?Apollo PS4游戏存…

2026/7/11 0:12:14 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻