尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用Python实现UDP简易聊天程序!先搞懂:为啥UDP不能直接做聊天软件?
前言平时我们熟知的微信、QQ这类聊天软件底层网络方案各有不同。很多初学者第一想法直接用UDP写聊天工具代码简单、不用建立连接、速度快。但是很多人写完Demo后就踩坑消息偶尔收不到、重复收到消息、消息顺序错乱。原因很简单UDP是无连接、不可靠传输协议。内核不保证报文送达、不保证有序、丢包不会通知发送方。本文先实现一套原生UDP点对点聊天Demo服务端客户端可以互相收发文本消息模拟简易聊天窗口。再结合代码讲解原生UDP聊天存在的致命缺陷衔接上一篇《如何让UDP实现可靠传输》的知识点带大家理解商用聊天软件不会直接裸UDP通信。环境Python3.x无需额外安装第三方库使用内置socket模块。演示效果两个终端互相发送文字实现双向聊天。一、基础知识点UDP通信特点回顾无连接通信前不需要握手发送数据直接指定IP和端口尽最大努力交付没有确认、没有重传丢包直接消失支持双向通信同一个Socket既可以收消息也可以发消息面向报文不会拆分合并数据包优点开销小、延迟低缺点不可靠。⚠️ 重要TCP分为服务端/客户端UDP模式更灵活下面示例我们采用对等模式P2P两端代码几乎一致只要填写对方IP端口互相收发消息。二、Python UDP双向聊天完整代码文件名udp_chat.pyimportsocketimportthreadingclassUDPChat:def__init__(self,local_port:int,remote_ip:str,remote_port:int):# 创建UDP socketself.socksocket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 绑定本机端口固定端口方便对方连接self.sock.bind((0.0.0.0,local_port))self.remote_ipremote_ip self.remote_portremote_portprint(f✅ UDP聊天启动成功本机端口{local_port})print(f 目标地址{self.remote_ip}:{self.remote_port})print( 输入消息发送exit退出程序\n)defreceive_msg(self):持续接收消息的循环单独线程运行whileTrue:try:data,addrself.sock.recvfrom(1024)msgdata.decode(utf-8)print(f\n【对方】{msg})print(你,end)exceptExceptionase:print(接收消息异常,e)breakdefsend_msg(self):读取控制台输入发送消息whileTrue:contentinput(你)ifcontent.lower()exit:print( 退出聊天程序)self.sock.close()break# 发送文本消息self.sock.sendto(content.encode(utf-8),(self.remote_ip,self.remote_port))defstart(self):# 开启子线程负责接收消息阻塞recvfrom不能阻塞输入recv_threadthreading.Thread(targetself.receive_msg,daemonTrue)recv_thread.start()# 主线程负责发送消息self.send_msg()if__name____main__:# 配置区域两端修改此处参数 # A机器配置机器A# 本机端口 8888对方IP为机器BIP对方端口9999chatUDPChat(local_port8888,remote_ip127.0.0.1,remote_port9999)# B机器配置机器B启动时注释上面启用下面这行# chat UDPChat(local_port9999, remote_ip127.0.0.1, remote_port8888)chat.start()三、运行测试步骤本地测试同一台电脑开启两个终端终端1A端使用配置chatUDPChat(local_port8888,remote_ip127.0.0.1,remote_port9999)终端2B端切换配置chatUDPChat(local_port9999,remote_ip127.0.0.1,remote_port8888)分别运行python udp_chat.py互相输入文字即可聊天。局域网/公网注意事项局域网通信填写对方内网IP公网通信需要端口映射、关闭防火墙云服务器务必在安全组开放对应UDP端口。运行效果图文字示例✅ UDP聊天启动成功本机端口8888 目标地址127.0.0.1:9999 输入消息发送exit退出程序 你哈喽测试UDP聊天 【对方】收到啦 你四、Demo暴露出原生UDP做聊天软件的4个致命问题1. 消息丢失最严重当网络波动、路由器拥塞时sendto执行成功仅仅代表数据交给系统内核无法确认对方收到消息。就像微信发消息对方收不到且你完全不知情。TCP会等待ACK超时自动重传原生UDP没有任何机制。2. 消息乱序发送顺序消息1 → 消息2 → 消息3网络转发原因接收顺序可能变成消息3 → 消息1 → 消息2聊天场景会出现对话语序错乱严重影响体验。3. 消息重复网络延迟引发路由重复投递同一条消息多次弹出。4. 无法感知对方是否离线UDP无连接你持续发送消息对方下线后本地不会得到任何通知。不知道对方在线状态。五、思考真正的聊天软件如何解决方案分三类基于TCP微信早期部分业务、传统IM依靠TCP天然可靠缺点握手延迟网络切换容易断连。可靠UDP应用层封装在UDP之上增加序列号、ACK确认、超时重传KCP、QUIC。很多游戏、实时语音、部分新式IM采用该方案。混合方案信令消息TCP可靠传输媒体语音视频使用优化后的UDP。我们上一篇博客讲解的【可靠UDP实现方案】正好可以改造这个聊天Demo增加序列号、ACK应答、超时重传就能解决消息丢失、乱序、重复问题。六、拓展优化思路你可以自行改造代码给每条消息增加唯一序列号接收端回复ACK确认收到消息发送端未收到ACK则启动重传增加心跳包检测对方在线状态增加乱序缓冲区保证消息有序展示增加用户名、消息时间戳增加简单异常断线处理。七、总结这份代码实现了极简UDP点对点文本聊天几分钟就能跑通直观感受到UDP双向通信。但是一定要分清Demo能跑 ≠ 可以生产使用。裸UDP天生缺乏可靠性机制直接拿来做聊天工具会出现消息丢失等各类问题。如果追求低延迟同时需要消息可靠不要直接裸写UDP两种选择方案一直接使用QUIC / KCP成熟可靠UDP库方案二参考可靠UDP原理在应用层自主实现确认、重传、有序机制。配套延伸阅读《如何让UDP实现可靠传输原理、问题与自研方案实践》
RELATED

相关推荐

小院里的小商机,靠它省出半年房租

小院里的小商机,靠它省出半年房租

小院里的小商机,靠它省出半年房租租厂房不如用小院,220V电就能干说白了,租个能放加工设备的厂房,小县城都得掏大几千。我去年折腾过,房东涨完租,把我利润刮掉三分之一。现在好了,我们公司这款四…

📅 2026/9/10 3:45:22
独立站SEO描述怎么写?3招让谷歌疯狂点击

独立站SEO描述怎么写?3招让谷歌疯狂点击

独立站SEO描述怎么写才能吸引谷歌点击 做独立站的友人皆明晰, 即便产品详情页撰写得极为美观精巧, 要是搜索引擎捉摸不透其中关键要点, 流量便根本无法得以实现。所说的独立站SEO描述, 简单来讲就是促使谷歌领会你的页面所阐述的内容为何, 而且乐意将其举荐给搜索的用户。我于…

📅 2026/9/16 15:25:12
2026郑州GEO地理引擎优化深度解析:本地实体企业AI精准获客首选方案

2026郑州GEO地理引擎优化深度解析:本地实体企业AI精准获客首选方案

2026郑州GEO地理引擎优化深度解析:本地实体企业AI精准获客首选方案2026年,人工智能搜索正式完成商业普及,彻底颠覆了传统互联网获客逻辑。以往企业依赖关键词排名、外链堆砌、竞价投放的传统SEO模式,已经无法适配AI大模型智能推荐…

📅 2026/9/16 15:59:36
MORE NEWS

更多资讯

📰

Claude Code 模板体系:固化项目上下文、权限与命令,让 AI 高效协作

有一段时间我对 Claude Code 又爱又恨。爱的是它写代码确实快,恨的是每开一个新项目,它都得重新“磨合”:不认识项目结构调整方向、不知道测试框架放哪、不清楚我要什么风格的提交信息。项目一多,大量时间都耗在重复交代背景、重复…

📰

CLI代码模板工具:离线生成AI优化项目骨架

1. 项目概述:一个被误读的 CLI 工具命名陷阱 “claude-code-templates”这个标题,乍看像是一款由 Anthropic 官方推出的、专为 Claude 模型服务的代码模板 CLI 工具。但实操过几十个类似命名项目的我必须先泼一盆冷水: 它不是 Anthropic 官方…

📰

MySQL学习路线:从安装建表到SQL优化与安全防护

我发现一个很有意思的现象:很多人决定学 MySQL 的第一件事,是去搜“mysql 安装教程”,装完之后再搜“sql 语句”,然后对着几十条命令发呆,完全不知道自己该干什么。这个学习路径不能说错,但它缺少一条主线—…

📰

Revit部件图纸自动标注:从原理到实操全指南

做BIM深化设计这些年,我最大的感受是:模型建得再漂亮,最后出图时如果标注跟不上,照样熬夜。Revit里面有一类图纸特别让人头疼,就是部件图纸——把一组构件组合成一个标准“部件”后,要为它单独出图&#xf…

📰

华为OD机考C卷真题:最佳升级时间窗与滑动窗口算法全解

最近不少人私信我,都在问华为OD机考到底怎么准备。翻来覆去聊得最多的,就是这道“最佳升级时间窗”。这题在C卷里出现频率相当高,而且要求你用Java、Python、JS、GO、C、C这六种语言都能写出正确答案。我干脆把这题的完整思路、六语言实现、机…

📰

C盘爆满怎么办?从默认安装路径到软件搬家清理的完整方案

C盘又红了,安装软件的时候光盯着“下一步”猛点,装完才发现系统盘空间又少了一大块。这应该是Windows用户最熟悉的痛。C盘不仅是系统盘,还要承接各种软件的默认安装位置,日积月累下来再大的分区也扛不住。你搜索“windows软件默认…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬