基地123 2023-09-28 21:41 采纳率: 90.2%
浏览 13
已结题

python网络编程问题

我在做一个用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()

```

  • 写回答

2条回答 默认 最新

  • Marst·Writer 2023-09-29 00:34
    关注

    应该是从接口获取文件数据不完整导致的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月10日
  • 已采纳回答 10月2日
  • 创建了问题 9月28日

悬赏问题

  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?