在Python中,可以通过内置的socket
模块实现UDP通信。UDP是无连接的协议,通信过程分为服务端和客户端。以下是详细实现步骤和示例代码:
1. UDP服务端(接收端)
import socket
# 创建UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP和端口
server_address = ('0.0.0.0', 8888) # 0.0.0.0表示监听所有可用接口
server_socket.bind(server_address)
print("UDP服务端已启动,等待接收数据...")
while True:
# 接收数据和客户端地址
data, client_address = server_socket.recvfrom(1024) # 1024为缓冲区大小
print(f"收到来自 {client_address} 的消息: {data.decode('utf-8')}")
# 可选:发送响应
response = "已收到消息!".encode('utf-8')
server_socket.sendto(response, client_address)
2. UDP客户端(发送端)
import socket
# 创建UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 目标服务端地址
server_address = ('127.0.0.1', 8888) # 替换为服务端实际IP
# 发送数据
message = "Hello, UDP Server!".encode('utf-8')
client_socket.sendto(message, server_address)
# 可选:接收服务端响应
data, _ = client_socket.recvfrom(1024)
print(f"收到服务端响应: {data.decode('utf-8')}")
# 关闭socket
client_socket.close()
关键点说明
-
socket.AF_INET
表示使用IPv4地址(如果是IPv6需用AF_INET6
)。 -
socket.SOCK_DGRAM
指定使用UDP协议(TCP是SOCK_STREAM
)。 -
bind()
vssendto()/recvfrom()
- 服务端必须调用
bind()
绑定端口。 - 客户端直接通过
sendto()
发送数据,无需连接。
- 服务端必须调用
-
无连接特性
UDP每次通信需明确指定目标地址(sendto
),且不保证数据顺序和可靠性。 -
数据编码
发送时需将字符串编码为字节(如encode('utf-8')
),接收时解码。
3. 测试步骤
- 先运行服务端代码(等待接收)。
- 再运行客户端代码(发送消息)。
- 观察服务端是否打印接收到的消息,以及客户端是否收到响应。
4. 常见问题
- 端口占用:确保端口未被其他程序占用(如重复运行服务端会报
Address already in use
)。 - 防火墙:若跨主机通信,需检查防火墙是否放行UDP端口。
- 数据丢失:UDP不保证可靠性,如需可靠传输需自行实现重传机制或改用TCP。
如果需要处理更复杂的场景(如超时、多线程),可以通过settimeout()
或结合threading
模块扩展。