基于socket实现大文件上传

2023-07-29,,

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()

  

可以获取文件 获取我们文件的大小(规定传的大小)

基于socket实现大文件上传的相关教程结束。

《基于socket实现大文件上传.doc》

下载本文的Word格式文档,以方便收藏与打印。