Python 使用 UDP发送接收文件
时间: 2024-10-19 19:10:49 浏览: 47
Python 中使用 UDP (User Datagram Protocol) 发送和接收文件通常用于需要快速、不可靠的数据传输场景,例如游戏数据包、实时通信等。因为 UDP 是无连接的,它不会保证数据的有序到达,也不提供确认机制,所以不适合用于文件传输,但对于小数据量、对延迟敏感的情况可能会更合适。
以下是基本的步骤:
**发送文件**:
```python
import socket
def send_file(file_path, recipient_ip, recipient_port):
with open(file_path, 'rb') as file:
data = file.read() # 读取文件内容为字节
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建UDP套接字
try:
sock.sendto(data, (recipient_ip, recipient_port)) # 发送数据到指定IP和端口
print(f"文件 {file_path} 已经发送给 {recipient_ip}")
finally:
sock.close()
# 调用函数,比如 send_file('example.txt', '192.168.1.100', 5000)
```
**接收文件**:
由于UDP无法直接创建连接并保持状态,接收方需要监听特定的端口,然后从收到的数据中识别出完整的文件。这通常涉及到分片数据包的重组。以下是一个简单的接收端示例:
```python
def receive_file(local_ip, local_port, save_path):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((local_ip, local_port))
buffer_size = 4096
received_data = b''
while True:
data, addr = sock.recvfrom(buffer_size) # 接收数据
if len(received_data) + len(data) > buffer_size * 10: # 为了防止无限循环,假设每个数据包不超过缓冲区大小的10倍
break
received_data += data
with open(save_path, 'wb') as f:
f.write(received_data)
print(f"成功接收来自 {addr[0]} 的文件并保存为 {save_path}")
sock.close()
# 调用函数,比如 receive_file('0.0.0.0', 5000, 'received_file.txt')
```
请注意,UDP传输文件并不适用于大规模或需要可靠性的应用,因为它不具备错误检测和恢复机制。此外,如果文件很大,这种方法效率很低,因为每次接收都需要处理整个数据包。
阅读全文