当前位置: 首页 > news >正文

认识Python数据包套接字

如你所知,数据包格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:强调快速传输而非传输顺序;传输的数据可能丢失也可能损毁;限制每次传输的数据大小;数据的发送和接收是同步的。数据包套接字也使用 IP 协议作路由,但是它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。

实际应用中,QQ 视频聊天和语音聊天主要使用 SOCK_DGRAM 来传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响。(当然,SOCK_DGRAM 没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件。)

我们将之前的程序改写一下,让服务端与客户端之间使用 UDP 协议进行通信。

服务端代码实现:

import time from socket import * import eventlet eventlet.monkey_patch() #用于绿化一些python的模块 serverSocket=socket(AF_INET,SOCK_DGRAM) #创建套接字对象 serverSocket.bind(("127.0.0.1",6666)) #绑定IP和端口,必须是元组形势 try: message,addr=serverSocket.recvfrom(1024) #接受客户端连接,connectionSocket是客户端连接服务器的信号,addr是客户端地址 print("收到"+addr[0]+":"+str(addr[1])+"的订单") time.sleep(10) #让线程等待10秒 serverSocket.sendto(bytes("您的订单已送达", encoding='utf-8'),addr) # 向客户端发送消息 for i in range(0,5): t=eventlet.Timeout(10,False) #设置超时时间为10秒 try: recv_data,addr=serverSocket.recvfrom(1024) print("收到消息,断开连接...") break except eventlet.timeout.Timeout as e: print("超时,重试中...") serverSocket.sendto(bytes("您的订单已送达", encoding='utf-8'),addr) # 向客户端发送消息 finally: t.cancel() #终止进程 except IOError: serverSocket.close() #关闭套接字对象 serverSocket.close() #关闭套接字对象

客户端代码实现:

from socket import * server_addr=("127.0.0.1",6666) #服务器的地址 clientSocket=socket(AF_INET,SOCK_DGRAM) #创建套接字对象 try: print("等待外卖骑手送餐...") clientSocket.sendto(bytes("等待外卖骑手送餐...",encoding='utf-8'),server_addr) recv_data,addr=clientSocket.recvfrom(1024) #接受服务器传来的消息 print(str(recv_data,encoding='utf-8')) #输出到控制台 clientSocket.sendto(bytes("我已收到,谢谢",encoding='utf-8'),server_addr) #向服务端发送消息 except IOError: clientSocket.close() #关闭套接字对象

运行截图如下:

注意,此时使用 UDP 协议通信时,客户端与服务端之间没有建立连接,这是因为 UDP 协议本身就是无连接的。服务端不再监听客户端的连接状态,那么客户端就必须先发送消息告知对方,服务端才能知道客户下单了。

在实际生活中,UDP 协议被应用于视频、音频等多媒体通信。

http://www.jsqmd.com/news/832807/

相关文章:

  • 轻量级API网关opencode-gateway:核心架构、部署实践与微服务集成指南
  • 别再只会Commit了!用Git Desktop搞定分支合并与冲突解决(附真实开发场景)
  • ARM Cortex-A78C缓存与TLB架构解析及优化实践
  • Armv8-A架构PMU寄存器解析与性能监控实战
  • 【STC8H】GPIO模式深度解析:从准双向到推挽,如何精准控制外设
  • Poe API逆向封装库:低成本调用Claude、GPT-4等顶级AI模型
  • 如何在Windows 11上让经典游戏重获新生:DDrawCompat兼容性解决方案详解
  • 基于GitHub Actions的自动化代码质量守护:CodeBuddy实战指南
  • Godot资源管理革命:用电子表格高效配置游戏数据
  • WMS 的核心算法模块可以归纳为:库位优化、路径规划、波次与拣选、库存预测与补货、任务调度、批次 / 效期管理、规则引擎、异常决策八大块,下面按模块拆开讲清楚原理与常用算法。
  • 如何选蜂蜜品牌?2026年5月推荐靠谱蜂蜜品牌避坑指南
  • 碳钢快开手孔与法兰人孔选型安装实用指南
  • DARPA FLA计划:无人机自主导航技术解析
  • DIY蓝牙游戏手柄:基于Bluefruit EZ-Key的免编程硬件制作全攻略
  • 自托管链接管理平台Linko:Go+React技术栈部署与核心功能解析
  • DIY焊接自行车维修架:从材料选择到焊接技术的完整制作指南
  • 手把手带你激活Matlab2016b:Windows 64位系统下的完整许可配置指南
  • ComfyUI-Manager终极指南:3步掌握AI绘画插件管理技巧
  • FiveM技能系统开发指南:从架构设计到实战部署
  • 基于Claude与向量数据库构建智能代码问答系统:原理、部署与优化
  • 从CPU到路由器:拆解数据分配器(DEMUX)与数值比较器在真实硬件里的隐藏角色
  • 2026年4月呼市有名的钢结构别墅施工公司口碑推荐,移动房屋/轻钢别墅房屋/农村自建别墅,钢结构别墅建设企业选哪家 - 品牌推荐师
  • 如何在Windows上无缝安装安卓应用:APK安装器终极指南
  • LC正弦波振荡器原理、设计与调试:从巴克豪森判据到电路实战
  • 从零到一:手把手教你将本地项目部署至GitLab远程仓库
  • Nixtla时间序列预测生态:从统计模型到深度学习的统一实践
  • 定时任务标准化管理:从Cron表达式到工程化实践
  • Translumo技术架构解析:构建高性能实时屏幕翻译系统的工程实践
  • 82.人工智能实战:大模型多环境治理怎么做?从开发、测试、预发到生产的 Prompt、模型、知识库隔离方案
  • 用Arduino与NeoPixel模拟真实物理水滴动画:从硬件搭建到代码实现