我在做一个用python编写的一个基于udp传输文件的代码,运行时,文件总是传不完全,不知道是网络丢包的问题,但是我更偏向最后文件写入的问题,我看了很久,我自己看不出来什么问题,来这里问一下。下面是我服务器端和客户端的代码。为什么循环读取我用1492作为参数是因为我测试一下,这个参数下传输出来的图片最完整。这里我也挺大疑问为什么。
import socket
import os
def deal_file_send():
#接收并解析文件名
file_name,client_address = udp_server_socket.recvfrom(4096)
file_name_data = file_name.decode()
#判断文件是否存在
if os.path.exists(file_name_data):
#构造文件信息传送给客户端
fsize = os.path.getsize(file_name_data)
fmb = fsize / float(1024 * 1024)
senddata = "文件名:%s 文件大小:%.2fMB" % (file_name_data, fmb)
udp_server_socket.sendto(senddata.encode(),(client_address[0],int(client_address[1])))
print("请求文件名:%s 文件大小:%.2f MB" % (file_name_data, fmb))
#接收客户端的反馈,是否需要下载文件
options,client_address = udp_server_socket.recvfrom(4096)
if options.decode() == 'y':
#读取文件并发送
with open(file_name_data, "rb") as f:
while True:
data = f.read(1492)
if data:
udp_server_socket.sendto(data,(client_address[0],int(client_address[1])))
else:
print("文件传输完毕")
break
else:
print("下载取消!")
else:
print("下载的文件不存在!")
udp_server_socket.close()
if __name__ == '__main__':
#切换工作目录
os.chdir("data")
current_directory = os.getcwd()
print("当前工作目录:", current_directory)
#创建udp套接紫字
udp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定服务器地址端口
server_address = ('10.100.224.69',8888)
udp_server_socket.bind(server_address)
#打印服务器状态信信息
print('udp文件传输服务已启动,并等待客户端连接')
#调用函数处理文件发送
deal_file_send()
```python
import socket
import os
if __name__ == '__main__':
# 创建udp套接紫字
udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#获取服务器ip并连接
server_ip = input("输入服务器IP:")
udp_client_socket.connect((server_ip, 8888))
# 发送下载文件的请求
file_name = input("请输入要下载的文件名:")
file_name_data = file_name.encode()
udp_client_socket.sendto(file_name_data,(server_ip, 8888))
#接收文件信息
file_info_data,server_address = udp_client_socket.recvfrom(4069)
file_info = file_info_data.decode()
print(file_info)
#是否下载文件
opts = input("是否下载?(y确认,q取消)")
if opts == 'y':
print("正在下载------")
udp_client_socket.sendto(b'y',(server_ip, 8888))
#创建接收目录
recv_path = "./receive/"
if not os.path.exists(recv_path):
os.mkdir(recv_path)
#写入数据到文件
with open(recv_path + file_name, "wb") as file:
while True:
file_data ,udp_server_address= udp_client_socket.recvfrom(1492)
if file_data:
file.write(file_data)
else:
print("下载完毕")
break
else:
print("下载取消")
#关闭套接字
udp_client_socket.close()
```