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

news2024/9/20 10:42:46

一. 题目介绍

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

- 客户端

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

  - 用户登录

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

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

  - 下载文件(进度条)

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

服务端

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

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

 

  • 支持登录

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

  • 支持上传

  • 支持下载

 二.设计思路

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

 设计思路代码体现:

class PanHandler(object):
    """ 业务功能代码 """
    def execute(self):
        pass

class Server(object):
    """ 基于普通socket的服务端 """

    def run(self, handler_class):
        # socket服务端
        # 一旦接受到请求之后,就让他执行 PanHandler
        instance = handler_class()
        instance.execute()
        pass

class SelectServer(object):
    """ 基于IO多路复用的socket的服务端 """

    def run(self, handler_class):
        # socket服务端(IO多路复用)
        # 一旦接受到请求之后,就让他执行 PanHandler
        instance = handler_class()
        instance.execute()
        pass


if __name__ == '__main__':
    server = Server()
    # server = SelectServer()
    server.run(PanHandler)

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

import socket
import select


class PanHandler(object):
    """ 业务功能代码 """

    def __init__(self, conn):
        self.conn = conn

    def 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 True


class 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对象.execute
            while True:
                result = instance.execute()
                if not result:
                    break

            conn.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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python因果推断库15】使用 sci-kit learn 模型进行回归断点分析

目录 导入数据 线性模型和主效应模型 线性模型、主效应模型和交互作用模型 使用bandwidth from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import ExpSineSquared, WhiteKernel from sklearn.linear_model import …

存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)

我们知道,在处理大量高并发网络时,一般考虑并发,以及设计对应的方案(比如select,poll,epoll)等。 那么如果频繁进行文件或者磁盘的操作,如何考虑性能和并发,这里就可以考虑用到io_uring。 0&a…

C语言深入理解指针二(15)

文章目录 前言一、指针变量类型的意义指针的解引用指针-整数void*指针 二、const修饰指针const修饰变量 三、指针运算指针-整数指针-指针指针比较大小 四、野指针野指针成因如何规避野指针 总结 前言 本节课开始上点有意思的内容了! 一、指针变量类型的意义 指针的…

Spark 集群进行 ETL 的架构介绍

一 什么是ETL ETL(extract提取、transform转换、load加载)。ETL负责将分散的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后,进行清洗、转换、集成,最后加载到数据仓库或数据集市中,成为联机分析…

论文速读|通过 SERL 算法优化轻量级双足机器人结构

论文地址:https://arxiv.org/pdf/2408.15632 这篇论文展示了SERL算法在双足机器人结构参数设计中的有效性,提供了推进该领域的重要见解。通过结合强化学习运动控制策略和进化算法,SERL算法成功识别出在指定设计空间内最能满足任务要求的结构…

GO语言性能分析

Go语言基准测试与pprof工具性能分析详解 在现代软件开发中,性能优化是一个重要的环节。Go语言提供了强大的工具来进行基准测试和性能分析,其中 testing 包用于基准测试,而 pprof 工具用于性能分析。本文将详细讲解如何使用这些工具来进行性能…

如何快速构建RTMP直播推送业务场景?

大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能…

美术|基于java+vue的美术外包管理信息系统(源码+数据库+文档)

美术管理信息系统 目录 基于javavue的美术资源管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农…

基于JAVA+SpringBoot+Vue的前后端分离的图书馆管理系统

基于JAVASpringBootVue的前后端分离的图书馆管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#…

【408 数据结构】第2章 线性表

文章目录 线性表考纲线性表的定义和基本操作1. 定义2. 线性表的基本操作 线性表的顺序表示1. 顺序表的定义2. 顺序表基本操作的实现初始化插入-时间复杂度O(n)删除-时间复杂度O(n)按值查找-时间复杂度O(n) 线性表的链式表示1. 单链表的定义2. 单链表基本操作的实现单链表的初始…

计算机毕业设计选题推荐-自驾游攻略管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

usb-ss 与 pcie 协议欣赏 --- linux kernel 欣赏

我们先来看usb ss phy , 然后看pcie phy. 我们先来看一下 usb ss phy 的第一条初始化通路. 这是基础设施的构建,这对应着系统启动时usb ss phy一系列稳定性问题 . 一看到probe函数,好啊,它是一切的根. 所谓的无源之水无本之木,这…

C++设计模式——Memento备忘录模式

一,备忘录模式的定义 备忘录模式是一种行为型设计模式,它允许将对象的状态保存在外部,并在需要时恢复。 备忘录模式允许在不破坏封装性的前提下,捕获并存储一个对象的内部状态,并在需要时将其恢复到之前的状态。 在…

IT前端好用的工具集

在线抠图网站 https://www.remove.bg/ 将iconfont转成css显示 https://transfonter.org/ 免费的在线图片压缩 https://tinypng.com/ JSON在线格式化工具 https://www.sojson.com/ 国内人工智能kimi.moonshot工具 https://kimi.moonshot.cn/chat/crft7a6sdv14grouufs0 自动…

2024年录屏神器大盘点,轻松捕捉屏幕精彩

现在讲解一些操作越来越便捷了,我 一般都是用录屏工具来边录制操作边讲解,这样可以更方便对方了解操作步骤。这次我就分享几款免费录屏工具一起来试试吧。 1.福晰录屏软件 链接:www.foxitsoftware.cn/REC/ 对于初次尝试录屏的新手来说&…

java语言发展史

Java语言的发展史是一部丰富多彩的科技演进史,它从一个简单的项目逐渐成长为全球范围内广泛使用的高级编程语言。下面,我将带您简要回顾Java的发展历程。 起源:Oak阶段(1991-1995) Java的前身是Oak,由詹姆斯…

【软考】设计模式之责任链模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。2.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为…

【漏洞复现】易天智能eHR CreateUser 任意用户添加漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

81页PPT产业园5G多功能智慧灯杆整体规划设计方案

学习9000多份智慧城市,智慧医院,智能制造,数字化转型,新质生产力,算力,大模型,AIGC,工业互联网,数字孪生......持续更新热点行业解决方案,公号智慧方案文库。…

计算机网络 --- 【2】计算机网络的组成、功能

目录 一、计算机网络的组成 1.1 从组成部分看 1.2 从工作方式看 1.3 从逻辑功能看 1.4 总结 二、计算机网络的功能 2.1 数据通信 2.2 资源共享​编辑 2.3 分布式处理 2.4 提高可靠性 2.5 负载均衡 一、计算机网络的组成 1.1 从组成部分看 我们举例分析计算机网络从…