一、UDP简介
UDP(User Datagram Protocol)是一种面向无连接的传输层协议,和TCP(Transmission Control Protocol)不同,UDP不提供可靠性、流量控制和拥塞控制机制。UDP只是把应用程序传给它的数据报发送出去,但是并不能保证它们能够到达目的地,也不能保证它们被接收方按照发送的顺序接收。
UDP协议广泛应用于互联网的视频、语音、游戏和实时数据传输等场景,因为UDP协议无需建立连接,可以在网络拥塞时快速传输数据,并且对于一些数据传输时效性要求高的场景,UDP的丢包机制也能够减少等待时间,提高用户体验。
二、UDP广播发送
广播发送是UDP协议的一种高效的数据传输方式,它可以在同一子网内的所有主机上同时发送数据,这样可以节省网络通信带宽和传输时间。
1. 创建UDP Socket并设置广播选项
import socket server_address = ('', 10000) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.bind(server_address)
前三行代码创建了一个UDP Socket实例,并指定IP地址为本地地址、端口号为10000,第四行代码设置了广播选项,表示发送广播数据。
2. 广播发送数据
message = b'Hello, world!' sock.sendto(message, ('255.255.255.255', 10000))
第一行代码定义了要发送的数据,第二行代码使用sendto()函数发送广播数据到所有主机的255.255.255.255地址,并且端口号也设置为10000。
三、UDP广播接收
广播接收是UDP协议的一种接收数据的方式,可以监听在特定的IP地址和端口上,接收来自广播发送者的所有数据。
1. 创建UDP Socket并绑定地址和端口
import socket server_address = ('', 10000) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(server_address)
前三行代码创建了一个UDP Socket实例,并指定IP地址为本地地址、端口号为10000,第四行代码设置SO_REUSEADDR选项,表示在端口号被占用时可以重新使用。
2. 接收广播数据
while True: data, address = sock.recvfrom(4096) print(f'Received {len(data)} bytes from {address}: {data}')
第一行代码进入循环,不断接收数据和返回客户端的连接信息。第二行代码使用recvfrom()函数接收从客户端发送过来的数据和地址信息,最后打印出接收的数据和发送方的IP地址。
四、UDP多播发送
多播是一种可以向一组主机同时发送数据的网络通信方式,它可以节省网络通信带宽和传输时间,并且对于一些数据传输时效性要求高的场景也非常有用。
1. 创建UDP Socket并设置多播选项
import socket multicast_group = ('224.3.29.71', 10000) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)
前三行代码创建了一个UDP Socket实例,第一行代码指定了多播组的IP地址和端口号,第四行代码设置了多播选项,表示发送多播数据。
2. 多播发送数据
message = b'Hello, world!' sent = sock.sendto(message, multicast_group)
第一行代码定义了要发送的数据,第二行使用sendto()函数发送多播数据,通过multicast_group指定了多播组的IP和端口号。
五、UDP多播接收
多播接收是UDP协议的一种接收数据的方式,可以监听在特定的IP地址和端口上,接收来自多播发送者的所有数据。
1. 创建UDP Socket并绑定地址和端口
import socket multicast_group = '224.3.29.71' server_address = ('', 10000) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(server_address) group = socket.inet_aton(multicast_group) mreq = struct.pack('4sL', group, socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
前五行代码创建了一个UDP Socket实例,指定了本地地址和端口号,第六行代码把多播组的IP地址转换成二进制格式,第七行代码打包了多播组的地址和接收端口号并设置IP_ADD_MEMBERSHIP选项,表示加入该多播组。
2. 接收多播数据
while True: data, address = sock.recvfrom(4096) print(f'Received {len(data)} bytes from {address}: {data}')
第一行代码进入循环,不断接收数据和返回客户端的连接信息。第二行代码使用recvfrom()函数接收从客户端发送过来的数据和地址信息,最后打印出接收的数据和发送方的IP地址。