UDP编程

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

UDP是面向消息的协议,如果通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,例如:

l 语音广播

l 视频

l 聊天软件

l TFTP(简单文件传送)

l SNMP(简单网络管理协议)

l RIP(路由信息协议,如报告股票市场、航空信息)

l DNS(域名解释)

和TCP类似,使用UDP的通信双方也分为客户端和服务器。

1 创建UDP 服务器

UDP 服务器不需要 TCP 服务器那么多的设置,因为它们不是面向连接的。除了等待传入的连接之外,几乎不需要做其他工作。下面我们来实现一个将摄氏温度转化为华氏温度的功能。

实例04 将摄氏温度转换为华氏温度

在客户端输入要转换的摄氏温度,然后发送给服务器,服务器根据转化公式,将摄氏温度转化为华氏温度,发送给客户端显示。创建udp_server.py文件,实现UDP服务器。具体代码如下:

import socket # 导入socket模块

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建UDP套接字

s.bind(('127.0.0.1', 8888)) # 绑定地址(host,port)到套接字

print('绑定UDP到8888端口')

data, addr = s.recvfrom(1024) # 接收数据

data = float(data)*1.8 + 32 # 转化公式

send_data = '转换后的温度(单位:华氏温度):'+str(data)

print('Received from %s:%s.' % addr)

s.sendto(send_data.encode(), addr) # 发送给客户端

s.close() # 关闭服务器端套接字

上述代码中,使用socket.socket()函数创建套接字,其中设置参数为socket.SOCK_DGRAM,表明创建的是UDP套接字。此外需要注意,s.recvfrom()函数生成的data数据类型是byte,不能直接进行四则运算,需要将其转化为float浮点型数据。最后在使用sendto()函数发送数据时,发送的数据必须是byte类型,所以需要使用encode()函数将字符串转化为byte类型。

运行结果如图14所示。

图14 等待客户端连接

2 创建UDP 客户端

创建一个UDP客户端程序的流程很简单,具体步骤如下:

l 创建客户端套接字

l 发送/接收数据

l 关闭套接字

下面根据17.3.1小节的实例,创建udp_client.py文件,实现UDP客户端,用户接收转换后的华氏温度。具体代码如下:

import socket # 导入socket模块

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建UDP套接字

data = input('请输入要转换的温度(单位:摄氏度):') # 输入要转换的温度

s.sendto(data.encode(), ('127.0.0.1', 8888)) # 发送数据

print(s.recv(1024).decode()) # 打印接收数据

s.close() # 关闭套接字

在上述代码中,主要就是接收的数据和发送的数据类型都是byte。所以发送时,使用encode()函数将字符串转化为byte。而在输出时,使用decode()函数将byte类型数据转换为字符串,方便用户阅读。

在两个cmd窗口中分别运行udp_server.py和udp_client.py文件,然后在udp_client.py窗口中输入要转换的摄氏度,udp_client.py窗口会立即显示转换后的华氏温度。如图15所示。

图15 将摄氏温度转换为华氏温度效果

3 执行UDP 服务器和客户端

在UDP通信模型中,在通信开始之前,不需要建立相关的连接,只需要发送数据即可,类似于生活中的 "写信"。UDP通信模型如图16所示。

图16 UDP通信模型

相关推荐
小小小米粒10 小时前
NAT 模式, 仅主机模式 Host-Only ,桥接模式 Bridge
linux·服务器·网络
Initialize-le10 小时前
WMware桥接模式配置静态IP上网
网络协议·tcp/ip·桥接模式
无心水11 小时前
【OpenClaw:实战部署】5、全平台部署OpenClaw(Win/Mac/Linux/云服务器)——10分钟跑通第一个本地AI智能体
java·人工智能·ai·智能体·ai智能体·ai架构·openclaw
写代码的二次猿12 小时前
安装openfold(顺利解决版)
开发语言·python·深度学习
一只大袋鼠12 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Eward-an12 小时前
LeetCode 1980 题通关指南|3种解法拆解“找唯一未出现二进制串”问题,附Python最优解实现
python·算法·leetcode
梦白.12 小时前
Python的容器类型
运维·python
※DX3906※13 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
cur1es14 小时前
【JVM类加载&双亲委派模型&垃圾回收机制】
java·jvm·gc·垃圾回收·类加载·双亲委派模型
@HNUSTer14 小时前
基于 Visual Studio Code 配置 Python 开发环境详细教程
ide·vscode·python·csdn开发云