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()
可以獲取文件 獲取我們文件的大小(規定傳的大小)