zoukankan      html  css  js  c++  java
  • 基于socket套接字发送大文件示例

    基于socket套接字上传大文件

    server端(服务端)

    import socket
    import struct
    import json
    
    server = socket.socket()
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    
    while True:
        conn, addr = server.accept()
        while True:
            try:
                hander = conn.recv(4)
                print('报头',hander)
                if hander == 0: break
    
                # 解析报头,并获取字典长度
                dic_len = struct.unpack('i', hander)[0]
    
                # 获得字典内容
                real_dic = json.loads(conn.recv(dic_len))
    
                # 从字典中获取 真实文件名和大小
                file_name = real_dic.get('file_name')
                file_size = real_dic.get('file_size')
    
                # 接受真实数据并保存到文件中
                with open(file_name, 'wb') as f:
                    size = 0
                    while size < file_size:
                        res = conn.recv(1024)
                        size += len(res)
                        f.write(res)
    
                print('接受成功')
                break
    
            except ConnectionResetError:
                break
    

    client端(客户端)

    import socket
    import json
    import struct
    import os
    
    client = socket.socket()
    client.connect(('127.0.0.1', 8080))
    
    # 获得文件名和文件大小
    while True:
        dir_list = os.listdir(r'F:pycharm文档5.18文件库')
    
        # 打印出可选上传文件
        [print(k,v) for k,v in enumerate(dir_list,start=1)]
    
        choice  = input('>>>:')
    
        if choice in ['1','2']:
            file_name = dir_list[int(choice) - 1]
            print('文件名:',file_name)
            file_path = os.path.join(r'F:pycharm文档5.18文件库',file_name)
            # 得到文件大小
            file_size = os.path.getsize(file_path)
            print('文件大小:',file_size)
            break
        else:
            print('again')
    
    # 制作报头字典内容
    dic = {
        'file_name':file_name,
        'file_size':file_size
    }
    dic_json = json.dumps(dic)
    dic_json_bytes = dic_json.encode('utf8')
    
    # 制作字典的报头
    hander = struct.pack('i',len(dic_json_bytes))
    client.send(hander)
    client.send(dic_json_bytes)
    
    # 发送真实数据
    with open(file_path,'rb') as f:
        for line in f:
            client.send(line)
    
    client.close()
    
  • 相关阅读:
    树状数组简述
    八皇后
    小木棍
    智力大冲浪
    晚餐队列安排
    修理牛棚
    转圈游戏
    关押罪犯
    借教室
    跳石头
  • 原文地址:https://www.cnblogs.com/shuchengyi/p/10886029.html
Copyright © 2011-2022 走看看