30-作业

1.需求分析

  1. 多用户同时登陆
    2. 用户登陆,加密认证
  2. 上传/下载文件,保证文件一致性
  3. 传输过程中现实进度条
    5. 不同用户家目录不同,且只能访问自己的家目录
    6. 对用户进行磁盘配额、不同用户配额可不同
    7. 用户登陆server后,可在家目录权限下切换子目录
    8. 查看当前目录下文件,新建文件夹
    9. 删除文件和空文件夹
    10. 充分使用面向对象知识
    11. 支持断点续传

2.流程图

img

3.代码准备

  • 字符串操作以及打印 —— 实现上传下载的进度条功能
def processBar(num, total):
rate = num / total
rate_num = int(rate * 100)
if rate_num == 100:
r = '\r%s>%d%%\n' % ('=' * rate_num, rate_num,)
else:
r = '\r%s>%d%%' % ('=' * rate_num, rate_num,)
sys.stdout.write(r)
sys.stdout.flush
  • socketserver —— 实现ftp server端和client端的交互
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
conn.sendall(bytes('欢迎致电 10086,请输入1xxx,0转人工服务.',encoding='utf-8'))
Flag = True
while Flag:
data = conn.recv(1024).decode('utf-8')
if data == 'exit':
Flag = False
elif data == '0':
conn.sendall(bytes('通过可能会被录音.balabala一大推',encoding='utf-8'))
else:
conn.sendall(bytes('请重新输入.',encoding='utf-8'))
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8008),MyServer)
server.serve_forever()
import socket
ip_port = ('127.0.0.1',8008)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5)
while True:
data = sk.recv(1024).decode('utf-8')
print('receive:',data)
inp = input('please input:')
sk.sendall(bytes(inp,encoding='utf-8'))
if inp == 'exit':
break
sk.close()
  • struct模块 —— 自定制报头解决文件上传下载过程中的粘包问题
import json,struct
#假设通过客户端上传1T:1073741824000的文件a.txt
#为避免粘包,必须自定制报头
header={'file_size':1073741824000,'file_name':'/a/b/c/d/e/a.txt','md5':'8f6fbf8347faa4924a76856701edb0f3'} #1T数据,文件路径和md5值
#为了该报头能传送,需要序列化并且转为bytes
head_bytes=bytes(json.dumps(header),encoding='utf-8') #序列化并转成bytes,用于传输
#为了让客户端知道报头的长度,用struck将报头长度这个数字转成固定长度:4个字节
head_len_bytes=struct.pack('i',len(head_bytes)) #这4个字节里只包含了一个数字,该数字是报头的长度
#客户端开始发送
conn.send(head_len_bytes) #先发报头的长度,4个bytes
conn.send(head_bytes) #再发报头的字节格式
conn.sendall(文件内容) #然后发真实内容的字节格式
#服务端开始接收
head_len_bytes=s.recv(4) #先收报头4个bytes,得到报头长度的字节格式
x=struct.unpack('i',head_len_bytes)[0] #提取报头的长度
head_bytes=s.recv(x) #按照报头长度x,收取报头的bytes格式
header=json.loads(json.dumps(header)) #提取报头
#最后根据报头的内容提取真实的数据,比如
real_data_len=s.recv(header['file_size'])
s.recv(real_data_len)
  • hashlib模块 —— 实现文件的一致性校验和用户密文登录

  • os模块 —— 实现目录的切换及查看文件文件夹等功能

  • 文件操作 —— 完成上传下载文件及断点续传等功能

面向对象编程思想+继承知识 —— 组织简化代码

4.评分标准:

  • 第一周:完成1-4需求

    1. 实现文件的上传、下载功能 30分
    2. 实现c/s端 密文登陆功能 20分
    3. 有效处理大文件 10分
    4. md5进行文件已执行校验 10分
    5. 实现进度条功能 10分
    6. 充分使用面向对象的知识 10分
    7. 目录结构、流程如和readme 10分
  • 第二周:

    1. 上周作业基础 40分
    2. 基于上周作业,每实现一个新功能 10分
posted @   指弹小能手  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2017-06-15 OCP 11G 实验环境安装文档 ( RedHat5.5 + Oracle11g )

关于作者:专注数据库、Python 开发、ROS、深度学习,请多多赐教!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(iamkuboy@163.com)咨询.

点击右上角即可分享
微信分享提示