基於socket實現大文件上傳


import socket

1.客戶端:

 操作流程:

  先拿到文件--->獲取文件大小---->創建字典

  1.制作表頭

  header  如何得到 他是一個二進制字符串 

  序列化得到 字典字符串 ----》轉成二進制字符串---header_bytes》打包 header_len = struct.pack('i' , len(header_bytes)

  2.發送表頭 client.send(header)

  3.發送字典

  client.send(header_bytfes)

  4.發送真實信息

  with open('文件路徑‘ ,“rb”) as f:

    for line in f :

      client.send(line)

  詳情:

import socket
import struct
import json
import os

# 第一步:
client = socket.socket()
# 綁定地址
client.connect(('127.0.0.1', 8080))

# 文件大小
file_size = os.path.getsize(r'D:\Data\day32\大文件上傳\基於socket 實現大文件上傳\hashlib.mp4')  # r' ' :表示原義字符串
print(file_size)
# 命名

file_name = '性感小姐姐在線發牌.mp4'

# 定義一個字典
my_dict = {"file_name": file_name,
           "file_size": file_size,
           "msg": '文件含有的信息哈哈自己寫的'}
#  序列化字典
data_bytes = json.dumps(my_dict).encode('utf-8')  # 目的一會要轉成字符串入內存
print("123345")
print(data_bytes)
# 制作報頭
header = struct.pack('i', len(data_bytes))  # 限制文件的大小
print(header)   # b'\xbc\x00\x00\x00'
# 發送報頭
client.send(header)  # 客戶端發送報頭信息
# 發送字典
client.send(data_bytes)     # 提示以字典的形式接收
print(data_bytes)

# 開始發送真實信息  客戶需要的詳細信息 發送到服務端進行處理
with open('D:\Data\day32\大文件上傳\基於socket 實現大文件上傳\hashlib.mp4', "rb")as f:
    for line in f:
        client.send(line)

  

2.服務端:

  來吧:

  接收報頭---header》解析報頭 返回字典格式:1.報頭得到我的字典長度header = conn.recv(4)  ---->獲取 header_len = struct.unpack('i' , header)[0] -----> header_bytes = conn.recv(header_len)

  header_dict= json.lods(header_bytes).decode('utf-8')

  

import os
import json
import socket
import struct

# 第一步

# IP_PORT = ('127.0.0.1', 8080)
# 可以寫縮寫上面的 試試吧
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)

while True:

    conn, addr = server.accept()  # 等待接收信息

    while True:

        try:
            # 接收報頭
            header = conn.recv(4)
            # 解析報頭,獲取報頭長度
            header_len = struct.unpack('i', header)[0]
            print(header_len)
            # 獲取 #b'{"file_name": "\\u6027\\u611f\\u5c0f\\u59d0\\u59d0\\u5728\\u7ebf\\u53d1\\u724c.mp4", "file_size": 205033304, "msg": "\\u6587
            header_bytes = conn.recv(header_len)
            print(header_bytes)     # # 二進制的字典的信息

            # 反序列化成字典
            header_dic = json.loads(header_bytes.decode('utf-8'))
            # 開始循環接收文件傳到本地
            print(header_dic)   # {'file_name': '性感小姐姐在線發牌.mp4', 'file_size': 254031692, 'msg': '注意身體哦'}
            file_name = header_dic.get("file_name")
            file_size = header_dic.get("file_size")
            recv_size = 0
            # print(file_name)    # 性感美女在線發牌.mp4

            with open(file_name, "wb")as f:
                while recv_size < file_size:
                    data = conn.recv(1024)
                    f.write(data)
                    recv_size = recv_size+len(data)
                    # print(len(data))
                    # print(recv_size) #第一次接收的值
                    break
            print(header_dic.get("msg"))    # 字典點.get是他的內置方法
        except ConnectionError:
            break
    conn.close()

  

可以獲取文件 獲取我們文件的大小(規定傳的大小)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM