基于tcp的云盘上传下载的模拟
老师的博客:
server端
import json
import struct
import json
import struct
import socket
import os
sk = socket.socket()
sk.bind(('192.168.43.155',8080))
sk.listen() conn,addr = sk.accept()
dic_len = conn.recv(4) # 4个字节 数字的大小
dic_len = struct.unpack('i',dic_len)[0]
content = conn.recv(dic_len).decode('utf-8') #
content_dic = json.loads(content)
if content_dic['operate'] == 'upload':
with open(content_dic['filename'],'wb') as f:
while content_dic['filesize']:
file = conn.recv(1024)
f.write(file)
content_dic['filesize'] -= len(file)
elif content_dic['operate'] == 'download':
file_path=content_dic['path']
file_name=os.path.basename(file_path)
file_size=os.path.getsize(file_path)
dic_from={'file_size':file_size,'file_name':file_name}
dic_from=json.dumps(dic_from).encode('utf-8')
dic_lenth=struct.pack('i',len(dic_from))
print(dic_lenth,type(dic_lenth))
conn.send(dic_lenth + dic_from)
with open(file_path,mode='rb') as f:
while file_size>0:
ret=f.read(1024)
conn.send(ret)
file_size -= 1024
print('传输完成')
else:
print('错了')
conn.close()
sk.close()
client端
import os
import json
import struct
import socket sk = socket.socket()
sk.connect(('192.168.43.155',8080)) def get_filename(file_path):
filename = os.path.basename(file_path)#os.path.basename(path) 返回path最后的文件名。
# 如果path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
return filename #选择 操作
operate = ['upload','download']
for num,opt in enumerate(operate,1):#枚举函数,第一个参数是对象,第二是是下标的开始计数
print(num,opt)
num = int(input('请输入您要做的操作序号 : '))
if num == 1:
'''上传操作'''
file_path = input('请输入要上传的文件路径 : ')
file_size = os.path.getsize(file_path) # 获取文件大小
file_name = get_filename(file_path)#获取文件路径
dic = {'operate': 'upload', 'filename': file_name,'filesize':file_size}
str_dic = json.dumps(dic).encode('utf-8')
ret = struct.pack('i', len(str_dic)) # 将字典的大小转换成一个定长(4)的bytes
sk.send(ret + str_dic)
with open(file_path,'rb') as f:
while file_size:
content = f.read(1024)
sk.send(content)
file_size -= len(content)
print('上传成功')
elif num == 2:
'''下载操作'''
download_path=input('请输入你要下载的路径')
dic=json.dumps({'operate':'download','path':download_path}).encode('utf-8')
download_path_unm=struct.pack('i',len(dic))
sk.send(download_path_unm+dic)#发送信息
get_information=sk.recv(4)#接受即将带来的信息的长度
get_information_real=struct.unpack('i',get_information)[0]#转化为真是数字 get_real_information=sk.recv(get_information_real).decode('utf-8')#接受,解压 get_real_information=json.loads(get_real_information)
download_file_name=get_real_information['file_name']
download_file_size=get_real_information['file_size']
with open(download_file_name,mode='wb') as f:
while download_file_size>0:
print(download_file_size)
code=sk.recv(1024)
f.write(code)
download_file_size -= 1024 print('下载成功')
sk.close()
说明:
上传老师写的,我自己是吧下载给补充的写了,所以上传和下载的代码应该还可以优化一下。
下面是在写代码中遇到的问题,总结一下:
1.struct中,把数字转化为4的固定长度的bytes类型,所以就不需要再进行encode操作,因为本身就是bytes类型的,而却其编码方式叫特别,只能通过unpack才能转化为数字,记住是int,通过其他方式。例如。gbk。utf-8decode是str类型,但是内容确实空白的·另外关于unpack得到的是个元祖,所以的到的值需要取第0位数,来取到你需要的数字。
2,json模块,由于json是把数据类型给转化为str类型的,所以还需要在进行encode()的操作,来吧其转化为bytes类型的。所以拿到是,应该首先decode()。
3,send的是时候可以采用(内容1+内容2)的形式,表示两次发送的
4,下载上传是必需要把文件的大小拿到,然后采用相等的大小传输,所以需要把文件大小先传输过去,然后在进行同时的收发操作。
5.while循环是,条件应该写成长度<0是结束,因为有很大的情况下,大小-=1024是不可能刚好减到0的,如果为负数的时候,条件还是为真,所以不会终止循环,然后就出不来了。
6,数据传输和接受的时候都是以bytes的方式打开或者写入的,而且在不需要写编码方式,因为传输的有可能是视频。
基于tcp的云盘上传下载的模拟的更多相关文章
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- Python 基于Python实现Ftp文件上传,下载
基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...
- 使用pcs api往免费的百度网盘上传下载文件
百度个人云盘空间大,完全免费,而且提供了pcs api供调用操作文件,在平时的项目里往里面保存一些文件是很实用的. 环境准备: 开通读写网盘的权限及获取access_token:http://blog ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- 专题十一:实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- NetworkComms 文件上传下载和客户端自动升级(非开源)
演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...
- (转载)基于Bash命令行的百度云上传下载工具
原文链接:http://hi.baidu.com/meoow/item/aef5814bbd5be3e1bcf451e9 这是我根据百度云PCS的API写的一个基于bash的命令行工具, 使用了cur ...
- 基于Spring Mvc实现的Excel文件上传下载
最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库.因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例. 基础框架 之前曾经介绍过一个最简单的spring ...
随机推荐
- Owin学习笔记(一) Owin的前生今世
ASP.NET框架至今为止已经存在了数十年了,大量的网站使用ASP.NET框架进行开发.随着网站应用开发技术的进步, 许多网站应用开发框架有了新的流行趋势 轻量化 模块化 可移植 ASP.NET框架 ...
- CentOS安装FTP服务
最近公司有一个内部比赛(黑客马拉松),报名参加了这么一个赛事,在准备参赛作品的同时(参赛服务器需要自己搭建),借着这个机会,决定把tomcat部署相关的知识从0到1重新捋一遍.就当备忘录了. FTP服 ...
- leetcode — triangle
/** * Source : https://oj.leetcode.com/problems/triangle/ * * * Given a triangle, find the minimum p ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-新增锁定用户与解除锁定用户的功能
锁定用户功能在现实应用场景中得到了大量的应用,当我们需要限制某用户的登录,又不能删除这个用户时就可以使用锁定功能,如:未授权的用户尝试错误密码错误过多可以尝试的用户进行锁定,又如ATM机上取钱时密码错 ...
- 磊哥评测之数据库:腾讯云MongoDB vs自建
本文由云+社区发表 作者:磊哥 上期文章我们聊到了redis.这期我们来说说另一个网红nosql数据库:MongoDB.有这么一个介绍MongoDB的说法是:MongoDB是非关系数据库当中功能最丰富 ...
- J2EE规范总结
概述 J2ee是我们步入java学习的一个開始.它将开启这趟奇幻之旅,Java是一种简单的,跨平台的,面向对象的,分布式的.解释的.健壮的安全的.结构的中立的,可移植的.性能非常优异的多线程的,动态的 ...
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式(Res ...
- React Fiber源码分析 (介绍)
写了分析源码的文章后, 总觉得缺少了什么, 在这里补一个整体的总结,输出个人的理解~ 文章的系列标题为Fiber源码分析, 那么什么是Fiber,官方给出的解释是: React Fiber是对核心算法 ...
- Qt实现半透明遮罩效果
本文索引: 需求 原理 实现遮罩控件 遮罩的使用 需求 我们在显示一些模态对话框的时候,往往需要将对话框的背景颜色调暗以达到突出当前对话框的效果,例如: 对话框的父窗口除了标题栏以外的部分都变暗了,在 ...
- C# 如何在PDF中绘制不同风格类型的文本
通过对控件Spire.PDF的测试,我们可以创建PDF文件并向文档中绘制文本.图片.表格.图形等内容,其中,对于绘制文本这一部分,Spire.PDF提供了三种字体类型来绘制文本,即: Standard ...