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实现大文件上传的更多相关文章

  1. 基于 WebSocket 的聊天和大文件上传(有进度提示)完美实现

    大家好,好久没有写文章了,当然不是不想写,主要是工作太忙,公司有没有网络环境,不让上网,所以写的就少了.今天是2019年的最后一天,明天就要开始新的一年,当然也希望自己有一个新的开始.在2019年的最 ...

  2. java 大文件上传 断点续传 完整版实例 (Socket、IO流)

    ava两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...

  3. TCP大文件上传与UDP协议

    一.UCP大文件上传(解决粘包问题) ①客户端 import socket, os, json, struct client = socket.socket() client.connect(('12 ...

  4. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  5. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  6. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  7. tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)

    tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...

  8. 使用百度webuploader实现大文件上传

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  9. web大文件上传(web应用---SSH框架)

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

随机推荐

  1. jQuery ajax - ajaxSetup() 方法

    实例 为所有 AJAX 请求设置默认 URL 和 success 函数: $("button").click(function(){ $.ajaxSetup({url:" ...

  2. CF D. Labyrinth 01BFS

    由于上下走不限制,所以按照贪心,我们应该尽可能走上下方向. 我们可以开一个双端队列,并认为每次提取队首的时候得到的是到达该点的最优策略.(这个一定是唯一的,因为不可能向右走几格,然后再退回去. ) 那 ...

  3. 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders

    从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...

  4. Beyond Compare4 激活

    当你使用过一段时间后会提示有问题,需要激活或者什么. 解决办法: 找到这个路径并删除其下Beyond Compare 4文件夹即可正常使用. C:\Users\******\AppData\Roami ...

  5. javascript处理json字符串

    字符串转JSON格式 var obj = JSON.parse(json字符串); 判断字段值是否存在,返回true或false obj.hasOwnProperty("error" ...

  6. 如何吸引用户打开自己发送的EDM邮件

    一般来说,邮件发送到用户的收件箱,但用户不一定会阅读.因为每个用户收到的邮件都很多.那么,究竟应该如何吸引读者打开自己的EDM邮件呢? 只有当用户认识并信任发件人的时候,此时邮件的打开率是最高的,可以 ...

  7. sorted()与sort()函数

    1 sorted可以对series,ndarry,list类型进行排序 默认会从小到大进行排序 arr1 = np.array([1,2,3,4,44,3243,43,8678]) print(sor ...

  8. request.getParameter() 和request.getAttribute()

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wrs120/article/details/79287607[相同点] 1.都是HttpServle ...

  9. 关于 5.4 Eloquent ORM first() 与 get() 判断是否为空

    例如: $model = Model::first(); 可以通过is_null()来判断 $model = Model::get(); laravel自带了一个方法  $model->isEm ...

  10. Html mate标签的常见功能

    一.常用的功能 1.禁止屏幕缩放 <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, us ...