用Python实现UDP简易聊天程序!先搞懂:为啥UDP不能直接做聊天软件?
📅 2026/8/2 5:21:59
👁️ 次浏览
前言平时我们熟知的微信、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实现可靠传输原理、问题与自研方案实践》
小院里的小商机,靠它省出半年房租租厂房不如用小院,220V电就能干说白了,租个能放加工设备的厂房,小县城都得掏大几千。我去年折腾过,房东涨完租,把我利润刮掉三分之一。现在好了,我们公司这款四…
📅 2026/8/2 5:21:59
1. 从一次深夜告警说起:502错误的“突袭”凌晨两点,手机突然开始疯狂震动。运维监控系统发来一连串告警:“生产环境核心服务接口大量返回502 Bad Gateway”。睡意瞬间全无,这几乎是所有后端开发和运维人员最不愿看到的错误码之一。…
📅 2026/8/2 5:20:59
1. 项目概述:当UGV遇上Jetson Orin,一个AI机器人的诞生最近在机器人圈子里,一个名为“UGV Beast PT Jetson Orin AI Kit”的项目引起了我的注意。简单来说,这是一个集成了NVIDIA Jetson Orin系列高性能AI计算模块的无人地面车辆&a…
📅 2026/8/2 5:20:59
1. 项目概述:当社交遇上AI,我们到底在聊什么?最近“Soul AI”这个概念在圈子里讨论得挺热,我身边不少做社交产品、搞AI应用开发的朋友都在琢磨这事儿。乍一听,你可能觉得这又是一个被过度包装的“AI”概念,…
📅 2026/8/2 6:24:37
作为电子工程领域的从业者,我一直对各类网红电子美容产品的技术原理很感兴趣。最近电弧笔(也称点痣笔、等离子笔)争议很大,我特意找了几款产品的拆解资料和电路原理图,从技术角度分析一下它的安全隐患。先讲电弧笔的基…
📅 2026/8/2 6:24:37
1. 项目概述:当学术配图遇上AI智能体最近在学术圈和AI开发社区里,一个名为PaperBanana的项目引起了不小的讨论。这个由北京大学和谷歌的研究人员联合开源的工具,号称能用5个智能体(Agent)搞定论文配图的所有工作&#…
📅 2026/8/2 6:24:37
1. 从“尴尬”到“从容”:为什么Hadoop是数据工程师的必修课最近在技术社区里看到一个挺有意思的讨论,说“不会搭Hadoop集群的大数据开发工程师,尴尬了”。这话虽然带点调侃,但确实戳中了很多初入大数据领域朋友们的痛点。Hadoop&…
📅 2026/8/2 6:24:37
神州 副主任医师 **职称**:副主任医师 ✅ **学历**:山东中医药大学 中医内科学硕士(2011年毕业) ✅ **重磅荣誉**:**2020年山东省卫健委授予【山东基层名中医】**(省级官方中医人才荣誉,基层中医…
📅 2026/8/2 6:24:37
1. 项目概述:CH343 USB UART Board是什么?如果你玩过单片机、树莓派或者路由器刷机,大概率接触过一个叫“USB转TTL”的小玩意。它就像一座桥梁,一头连着电脑的USB口,另一头连着设备上那个只有几根线的串口(…
📅 2026/8/2 6:23:37
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/2 1:22:12
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/2 0:02:59
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/2 1:22:12