下面是完整的攻略。
概述
UDP是一种面向无连接的协议,它与TCP类似,都属于运输层协议,但与TCP不同的是,UDP主要面向无连接、高效、快速的数据传输。在网络游戏、视频、音频流媒体等领域中,UDP被广泛应用,因为这些应用对传输速度的要求较高,对数据丢失的容忍度也较高。
本文将介绍如何使用Python进行UDP通信。我们将通过两个示例来说明UDP通信的基本流程以及UDP广播的实现方式。
示例1:UDP服务器端和客户端
服务器端
在服务器端,我们首先需要创建一个套接字,指定协议类型和IP地址以及端口号:
import socket
HOST = '127.0.0.1' # 本地地址
PORT = 8000 # 端口号
# 创建UDP套接字,指定IPv4协议和UDP类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口号
s.bind((HOST, PORT))
接着,我们可以通过recvfrom()
方法接收客户端发送过来的数据,并通过sendto()
方法将数据发送给客户端:
while True:
# 接收客户端发送过来的数据和客户端地址
data, addr = s.recvfrom(1024)
# 打印客户端发送过来的数据
print(f'received from {addr}: {data.decode()}')
# 发送响应给客户端
s.sendto(b'ACK', addr)
在上面的代码中,我们使用了一个死循环,不断地接收数据并发送响应。recvfrom()
方法的参数是数据的最大长度,单位为字节。如果数据的长度超过了指定的长度,则会被截断。
客户端
在客户端,我们同样需要创建一个UDP套接字,然后向服务器端发送数据,最后接收服务器端发送过来的响应:
import socket
HOST = '127.0.0.1' # 服务器地址
PORT = 8000 # 端口号
# 创建UDP套接字,指定IPv4协议和UDP类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据到服务器
s.sendto(b'Hello, world!', (HOST, PORT))
# 接收服务器发送过来的响应
data, addr = s.recvfrom(1024)
print(f'received from {addr}: {data.decode()}')
我们在上面的代码中,调用sendto()
方法向服务器端发送了一条字符串数据,并通过recvfrom()
方法接收服务器端发送过来的响应。需要注意的是,服务器端发送的响应是一个字节串,需要通过decode()
方法将其转换为字符串。
示例2:UDP广播
UDP广播指的是一台主机向同一网络中的所有主机发送数据。在UDP广播中,源地址设置为0.0.0.0,目标地址设置为255.255.255.255或者子网中的广播地址。我们可以使用Python的socket
模块中的SO_BROADCAST
选项来启用UDP广播功能。
发送广播
在发送广播前,我们需要创建一个UDP套接字,并设置SO_BROADCAST
选项:
import socket
HOST = '255.255.255.255' # 广播地址
PORT = 8000 # 端口号
# 创建UDP套接字,指定IPv4协议和UDP类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 开启广播选项
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
接下来,我们可以使用sendto()
方法发送广播数据:
while True:
# 发送广播数据
s.sendto(b'Hello, world!', (HOST, PORT))
在上面的代码中,我们向地址为255.255.255.255
、端口为8000
的广播地址发送一条字符串数据。需要注意的是,在不同的操作系统中,对UDP广播的支持程度不同,有些操作系统可能需要管理员权限才能发送广播。此外,在局域网中,防火墙有可能会阻止广播数据的传输。
接收广播
在接收广播数据时,我们需要先创建一个UDP套接字,并绑定到一个固定的端口上:
import socket
HOST = '0.0.0.0' # 本地地址
PORT = 8000 # 端口号
# 创建UDP套接字,指定IPv4协议和UDP类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口号
s.bind((HOST, PORT))
没有了目标地址会出现奇怪的但是已经有敲黑板打勾了呢
接下来,我们可以使用recvfrom()
方法接收从网络中发送过来的广播数据:
while True:
# 接收广播数据和发送广播数据的主机地址
data, addr = s.recvfrom(1024)
# 打印广播数据和发送广播数据的主机地址
print(f'received from {addr}: {data.decode()}')
在上面的代码中,我们使用了一个死循环,不断地接收广播数据并打印出来。recvfrom()
方法的参数是数据的最大长度,单位为字节。如果数据的长度超过了指定的长度,则会被截断。
总结
本文介绍了Python中使用UDP进行网络通信的基本流程,以及如何通过UDP广播在同一网络中进行数据传输。在网络编程中,UDP并不像TCP那样稳定可靠,但是在一些特定的应用场景中,UDP具有很重要的作用。在实际应用中,我们需要根据具体的需求选择合适的网络通信协议来进行数据传输。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子) - Python技术站