当前位置: 首页 > news >正文

练习:基于TCP协议实现一个网盘系统

一. 题目介绍

请基于TCP协议实现一个网盘系统,包含客户端、服务端,各自需求如下:

- 客户端

  - 用户注册,注册成功之后,在服务端的指定目录下为此用户创建一个文件夹,该文件夹下以后存储当前用户的数据(类似于网盘)。

  - 用户登录

  - 查看网盘目录下的所有文件(一级即可),ls命令

  - 上传文件,如果网盘已存在则重新上传(覆盖)。

  - 下载文件(进度条)

先判断要下载本地路径中是否存在该文件。
- 不存在,直接下载
- 存在,则让用户选择是否续传(继续下载)。
    - 续传,在上次的基础上继续下载。
    - 不续传,从头开始下载。

服务端

  • 支持注册,并为用户初始化相关目录。

注册成功之后,将所有用户信息存储到特定的Excel文件中 

 

  • 支持登录

  • 支持查看当前用户网盘目录下的所有文件。

  • 支持上传

  • 支持下载

 二.设计思路

1. 服务端代码模块设计思路,可以实现单服务功能和多服务兼容功能。

 设计思路代码体现:

class PanHandler(object):""" 业务功能代码 """def execute(self):passclass Server(object):""" 基于普通socket的服务端 """def run(self, handler_class):# socket服务端# 一旦接受到请求之后,就让他执行 PanHandlerinstance = handler_class()instance.execute()passclass SelectServer(object):""" 基于IO多路复用的socket的服务端 """def run(self, handler_class):# socket服务端(IO多路复用)# 一旦接受到请求之后,就让他执行 PanHandlerinstance = handler_class()instance.execute()passif __name__ == '__main__':server = Server()# server = SelectServer()server.run(PanHandler)

 上述代码缺点就是:基于IO多路复用的socket的服务端的server里面的代码处理逻辑相对于普通的socket的服务端还是比较复杂的,为了兼容二者之间的差异,可以做兼容2种服务的代码优化:

import socket
import selectclass PanHandler(object):""" 业务功能代码 """def __init__(self, conn):self.conn = conndef execute(self):"""处理客户端的请求:return:  False,断开连接;True,继续执行当前客户端发来的请求。"""data = self.conn.recv(1024)content = data.decode('utf-8')if content.upper() == "Q":return False# 1.处理登录# "login wupeiqi xxx"# 2.注册# register wupeiqi xxx# ....self.conn.sendall(b'xxxx')return Trueclass Server(object):""" 基于普通socket的服务端 """def run(self, handler_class):# socket服务端sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sock.bind(("IP", "端口"))sock.listen(5)while True:# 等待,客户端发来连接conn, addr = sock.accept()# 新客户端到来。 PanHandler对象instance = handler_class(conn)# 处理客户端的请求。 PanHandler对象.executewhile True:result = instance.execute()if not result:breakconn.close()sock.close()class SelectServer(object):""" 基于IO多路复用的socket的服务端 """def run(self, handler_class):server_object = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_object.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_object.setblocking(False)server_object.bind(("IP", "端口"))server_object.listen(5)socket_object_list = [server_object, "客户端socket对象1","客户端socket对象2" ]conn_handler_map = {"客户端socket对象1": PanHandler(conn1),"客户端socket对象2": PanHandler(conn2),}while True:# r = ["客户端socket对象4", ]r, w, e = select.select(socket_object_list, [], [], 0.05)for sock in r:# sock="客户端socket对象4"# 新连接到来,执行 handler的 __init__ 方法if sock == server_object:print("新客户端来连接")conn, addr = server_object.accept()socket_object_list.append(conn)# 实例化handler类,即:类(conn)conn_handler_map[conn] = handler_class(conn)continue# 一旦有请求发来,找到相关的 handler对象,执行他的 execute方法。#  execute方法返回False,则意味着此客户端要断开连接。handler_object = conn_handler_map[sock]   # 自己PanHandler(conn1),# 找到execute去处理各自的业务逻辑result = handler_object.execute()if not result:socket_object_list.remove(sock)del conn_handler_map[sock]sock.close()if __name__ == '__main__':# server = Server()server = SelectServer()server.run(PanHandler)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在windows下抓空包(monitor网卡+wareshark+MNM)
  • 105页PPT:华为ISC集成供应链变革、模式与方法解析
  • QT如何ui上的QTableWidget控件如何使用
  • 误删文件后的数据救赎实战恢复指南
  • ABB HDS大功率永磁同步伺服电机的创新特性
  • Java stream使用与执行原理
  • 速盾:你知道高防 IP 和高防 CDN 的区别吗?
  • Golang | Leetcode Golang题解之第395题至少有K个重复字符的最长子串
  • 《Python读取 Excel 数据》
  • 美术|基于java+vue的美术外包管理信息系统(源码+数据库+文档)
  • Java数据库连接池的优化与配置
  • 音视频入门基础:AAC专题(1)——AAC官方文档下载
  • Vue(7)——工程化开发
  • 人工智能在网络安全领域的应用探索
  • 基于51单片机的打点滴监控系统proteus仿真
  • 【技术性】Search知识
  • Docker 笔记(2):Dockerfile
  • Java读取Properties文件的六种方法
  • Java深入 - 深入理解Java集合
  • js操作时间(持续更新)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 聊聊flink的BlobWriter
  • 码农张的Bug人生 - 见面之礼
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 译自由幺半群
  • 原生js练习题---第五课
  • k8s使用glusterfs实现动态持久化存储
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # Java NIO(一)FileChannel
  • #FPGA(基础知识)
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (done) 两个矩阵 “相似” 是什么意思?
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Qt) 默认QtWidget应用包含什么?
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (分享)自己整理的一些简单awk实用语句
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (四)事件系统
  • (一)Neo4j下载安装以及初次使用
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .axf 转化 .bin文件 的方法
  • .gitignore不生效的解决方案
  • .Net Core 生成管理员权限的应用程序
  • .NET Core中Emit的使用
  • .net 反编译_.net反编译的相关问题
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NetCore项目nginx发布
  • .NET连接MongoDB数据库实例教程
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net中wcf服务生成及调用