UDP概念:
用户数据报协议(User Datagram Protocol)是一个无连接的简单的面向数据报的运输层协议。
UDP协议的特点:
1)面向无连接的通讯协议
2)UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。
3)UDP是一个不可靠的协议
4)UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
【使用情况】
因为UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务, 比如
语音广播
视频
TFTP(简单文件传送)
SNMP(简单网络管理协议)
RIP(路由信息协议,如报告股票市场,航空信息)
DNS(域名解释)
首先我们来实现一个简单的UDP服务端
import socket
# 服务器的端口号
PORT = 8081
# 创建用于通讯的套接字socket对象
# 第一个参数指明地址集 第二个参数 socket.SOCK_DGRAM 指明使用的是UDP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 为服务器绑定身份,方便客户端能够知道服务器
# bind接收元祖数据,元祖数据中包含服务器的IP地址和端口号
addres = ("", PORT)
server_socket.bind(addres)
# recvfrom 调用是传的参数 表示此次最多能接收多少字节数据,
# 开辟空间 不能太大也不能太小 太大 浪费空间, 太小 丢失数据
# 会返回两个数据
# recv_data 表示接收到的数据,bytes类型 recv_data.decode()方法将bytes类型转换成字符串类型
# client_address表示发送数据的客户端身份,即客户端的ip地址和端口号的元祖
recv_data, client_address = server_socket.recvfrom(1024)
print('接收到了客户端%s传来的数据:%s' % (client_address, recv_data.decode()))
# 关闭服务器端的套接字 socket
server_socket.close()
需要注意的是
socket.AF_INET 使用的是ipv4,如果要想使用ipv6可以使用AF_INET6
recvfrom默认的是堵塞,会等待客户端传输数据
recvfrom 返回两个返回值 一个是接收到的数据(bytes类型) 另一个是发送数据的客户端的身份
然后我们需要再编写一个客户端的程序用来发送数据
import socket
# 创建用于通讯的套接字socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 客户端无需绑定地址信息,操作系统会随机分配一个端口号 供通讯使用
# 向服务器发送数据
# 第一个参数:要发送的数据(仍然是bytes类型), 第二个参数接收方的地址信息ip和端口
msg = input("请输入要发送的数据内容") # msg.encode() 将字符串类型转换为bytes类型
server_address = ('127.0.0.1', 8081) # 指明服务器的ip地址和端口号
client_socket.sendto(msg.encode(), server_address)
# 传输后如果不在使用套接字进行通讯,要关闭套接字
client_socket.close()
好了现在我们的客户端已经写好,现在来让我们看看效果吧
ok,我们的demo测试成功了。