老师的博客:

server端

  1. import json
  2. import struct
  3. import json
  4. import struct
  5. import socket
  6. import os
  7. sk = socket.socket()
  8. sk.bind(('192.168.43.155',8080))
  9. sk.listen()
  10.  
  11. conn,addr = sk.accept()
  12. dic_len = conn.recv(4) # 4个字节 数字的大小
  13. dic_len = struct.unpack('i',dic_len)[0]
  14. content = conn.recv(dic_len).decode('utf-8') #
  15. content_dic = json.loads(content)
  16. if content_dic['operate'] == 'upload':
  17. with open(content_dic['filename'],'wb') as f:
  18. while content_dic['filesize']:
  19. file = conn.recv(1024)
  20. f.write(file)
  21. content_dic['filesize'] -= len(file)
  22. elif content_dic['operate'] == 'download':
  23. file_path=content_dic['path']
  24. file_name=os.path.basename(file_path)
  25. file_size=os.path.getsize(file_path)
  26. dic_from={'file_size':file_size,'file_name':file_name}
  27. dic_from=json.dumps(dic_from).encode('utf-8')
  28. dic_lenth=struct.pack('i',len(dic_from))
  29. print(dic_lenth,type(dic_lenth))
  30. conn.send(dic_lenth + dic_from)
  31. with open(file_path,mode='rb') as f:
  32. while file_size>0:
  33. ret=f.read(1024)
  34. conn.send(ret)
  35. file_size -= 1024
  36. print('传输完成')
  37. else:
  38. print('错了')
  39. conn.close()
  40. sk.close()

client端

  1. import os
  2. import json
  3. import struct
  4. import socket
  5.  
  6. sk = socket.socket()
  7. sk.connect(('192.168.43.155',8080))
  8.  
  9. def get_filename(file_path):
  10. filename = os.path.basename(file_path)#os.path.basename(path) 返回path最后的文件名。
  11. # 如果path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
  12. return filename
  13.  
  14. #选择 操作
  15. operate = ['upload','download']
  16. for num,opt in enumerate(operate,1):#枚举函数,第一个参数是对象,第二是是下标的开始计数
  17. print(num,opt)
  18. num = int(input('请输入您要做的操作序号 : '))
  19. if num == 1:
  20. '''上传操作'''
  21. file_path = input('请输入要上传的文件路径 : ')
  22. file_size = os.path.getsize(file_path) # 获取文件大小
  23. file_name = get_filename(file_path)#获取文件路径
  24. dic = {'operate': 'upload', 'filename': file_name,'filesize':file_size}
  25. str_dic = json.dumps(dic).encode('utf-8')
  26. ret = struct.pack('i', len(str_dic)) # 将字典的大小转换成一个定长(4)的bytes
  27. sk.send(ret + str_dic)
  28. with open(file_path,'rb') as f:
  29. while file_size:
  30. content = f.read(1024)
  31. sk.send(content)
  32. file_size -= len(content)
  33. print('上传成功')
  34. elif num == 2:
  35. '''下载操作'''
  36. download_path=input('请输入你要下载的路径')
  37. dic=json.dumps({'operate':'download','path':download_path}).encode('utf-8')
  38. download_path_unm=struct.pack('i',len(dic))
  39. sk.send(download_path_unm+dic)#发送信息
  40. get_information=sk.recv(4)#接受即将带来的信息的长度
  41. get_information_real=struct.unpack('i',get_information)[0]#转化为真是数字
  42.  
  43. get_real_information=sk.recv(get_information_real).decode('utf-8')#接受,解压
  44.  
  45. get_real_information=json.loads(get_real_information)
  46. download_file_name=get_real_information['file_name']
  47. download_file_size=get_real_information['file_size']
  48. with open(download_file_name,mode='wb') as f:
  49. while download_file_size>0:
  50. print(download_file_size)
  51. code=sk.recv(1024)
  52. f.write(code)
  53. download_file_size -= 1024
  54.  
  55. print('下载成功')
  56. 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的云盘上传下载的模拟的更多相关文章

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

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

  2. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  3. 使用pcs api往免费的百度网盘上传下载文件

    百度个人云盘空间大,完全免费,而且提供了pcs api供调用操作文件,在平时的项目里往里面保存一些文件是很实用的. 环境准备: 开通读写网盘的权限及获取access_token:http://blog ...

  4. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  5. 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  6. 专题十一:实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  7. NetworkComms 文件上传下载和客户端自动升级(非开源)

    演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...

  8. (转载)基于Bash命令行的百度云上传下载工具

    原文链接:http://hi.baidu.com/meoow/item/aef5814bbd5be3e1bcf451e9 这是我根据百度云PCS的API写的一个基于bash的命令行工具, 使用了cur ...

  9. 基于Spring Mvc实现的Excel文件上传下载

    最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库.因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例. 基础框架 之前曾经介绍过一个最简单的spring ...

随机推荐

  1. 使用ML.NET预测纽约出租车费

    有了上一篇<.NET Core玩转机器学习>打基础,这一次我们以纽约出租车费的预测做为新的场景案例,来体验一下回归模型. 场景概述 我们的目标是预测纽约的出租车费,乍一看似乎仅仅取决于行程 ...

  2. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

  3. leetcode — binary-tree-zigzag-level-order-traversal

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  4. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  5. Spring Boot 2.x(七):优雅的处理异常

    前言 异常的处理在我们的日常开发中是一个绕不过去的坎,在Spring Boot 项目中如何优雅的去处理异常,正是我们这一节课需要研究的方向. 异常的分类 在一个Spring Boot项目中,我们可以把 ...

  6. ZXing 生成、读取二维码(带logo)

    前言 ZXing,一个支持在图像中解码和生成条形码(如二维码.PDF 417.EAN.UPC.Aztec.Data Matrix.Codabar)的库.ZXing(“zebra crossing”)是 ...

  7. org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

    [错误原因:]maven的配置文件不是最新的 [解决办法:]依次点击help ->Install New Software -> add ->https://otto.takari. ...

  8. javascript基础修炼(10)——VirtualDOM和基本DFS

    1. Virtual-DOM是什么 Virtual-DOM,即虚拟DOM树.浏览器在解析文件时,会将html文档转换为document对象,在浏览器环境中运行的脚本文件都可以获取到它,通过操作docu ...

  9. 【学习笔记】tensorflow图片读取

    目录 图像基本概念 图像基本操作 图像基本操作API 图像读取API 狗图片读取 CIFAR-10二进制数据读取 TFRecords TFRecords存储 TFRecords读取方法 图像基本概念 ...

  10. Chrome下面查看placeholder的样式

    在Chrome下面默认是看不到placeholder的样式的 我们可以通过在当前页面的开发者工具里面的settings 勾选下面这个选项,就可以看到了 下面是效果