UDP--- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议。
优点:传输速度快
缺点:不可靠
socket的中文意思是接插件:
创建socket
在 Python 中 使用socket 模块的类 socket 就可以完成:
socket.socket(AddressFamily,Type)
说明:
函数 socket.socket 创建一个 socket,返回该 socket的描述符,该函数带有两个参数:
- Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
-
udp服务端:
import socket
# 1. 创建套接字
server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#2. bind绑定ip地址和端口,为元祖tuple类型
#ip如果不指明,表示本机的任何一个ip地址
server_addr = ("", 8080)
server_sock.bind(server_addr)
while True:
# recv方法接收发送过来的数据
# 返回值为接收到的数据,参数(这里为1024)表示本次收取数据的最大字节数
# receive_data = server_sock.recv(1024)
# recvfrom与recv方法类似,不同的是可以将发送数据的客户端的地址也返回
receive_data, client_addr =server_sock.recvfrom(1024)
# 注意python3中收到的数据receive_data是bytes类型
# print(client_addr, ": ",receive_data)
# 将bytes数据转换为字符串类型
msg = receive_data.decode("utf-8")
# 将收到的数据显示输出
print(client_addr, ": ", msg)
# 我们假定如果客户端发送了quit,我们就关闭服务端的套接字(即关闭服务端)
if msg == "quit":
server_sock.close()
break
测试:
# -u 表示使用udp协议
# nc -u 服务器ip 服务器端口
nc -u 127.0.0.1 8080
udp客户端
import socket
# 1. 创建套接字
client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址
server_addr = ('127.0.0.1', 8080)
data = input("请输入要发送的内容:")
#只要用户输入的数据不为空,就向服务器端发送
while data:
# 2. 使用sendto方法向服务器发送数据
# sendto(bytes类型要发送的数据, 对方的地址)
client_sock.sendto(data.encode("utf-8"),server_addr)
data = input("请输入要发送的内容:")
# 当用户输入的数据为空("")时, 关闭客户端套接字
client_sock.close()
测试
服务端与客户端的程序我们都已完成,可以同时开启进行测试。
我们也可以用nc充当udf服务端来单独测试客户端程序。
# -l 表示作为服务端开启,进行监听listen
# -u表示使用udp协议
# nc-lu 绑定的服务器ip地址 端口
nc -lu 127.0.0.1 8080
网络编程中的广播
import socket
# 创建udp套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 告诉系统内核刚创建的套接字用来进行广播
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
data = input("请输入要广播的内容:")
while data:
# 注意对于广播对象地址的设置
# <broadcast>表示广播地址
s.sendto(data.encode("utf-8"), ("<broadcast>", 8080))
data = input("请输入要广播的内容:")
s.close()
udp总结
1.udp是传输层的一种协议,不需要进行连接就可以用来发送和接收数据,但不保证数据的可靠传输。
2. udp服务器、客户端
1、udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分
2、请求服务的一方称为:客户端
3、提供服务的一方称为:服务器
3. udp绑定问题
1、一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
2、客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况