FTP 实验之Python

FTP 实验 一,实现功能 1,1 Server 能够接受并处理 USER, PASS, RETR, STOR, QUIT, SYST, TYPE, PORT

本文包含相关资料包-----> 点击直达获取<-------

FTP 实验

一、实现功能

1.1 Server

  1. 能够接受并处理 USER, PASS, RETR, STOR, QUIT, SYST, TYPE, PORT, PASV, MKD,CWD, PWD, LIST, RMD, RNFR, RNTO (文档中提到的所有) 指令
  2. 支持多客户端,通过多线程 (pthread) 实现
  3. 能够完整传输大文件
  4. 能够接受并处理 APPE 及 REST 指令,即支持断点续传

1.2 Client

  1. 基于 PyQT 实现
  2. 能够通过 USER, PASS, RETR, STOR, QUIT, SYST, TYPE, PORT, PASV, MKD, CWD,PWD, LIST, RMD, RNFR, RNTO 等 (文档中提到的所有) 指令与标准的 FTP 服务器通信
  3. 能够在上一点的基础上,浏览 FTP 服务器文件,并完成文件上传、下载等功能,支持完整的大文件传输
  4. 实现了简洁的 GUI 界面

1.2.1 GUI

GUI 界面如图 1 所示,其中,最上部分的输入框分别用于输入各种必要信息,在输入合法的 Username, Password 及 IP:Port 之后,可以点击 Login 按钮登录 FTP 服务器。中间的框显示了文件列表,其内容按 Unix 的 ls 风格解析向服务器请求 LIST 返回的文件列表得到,展示了 PWD 下所有的文件 (目录) 信息,具体信息格式遵循 Unix 的 ls 返回值规范。双击一个文件即可弹出下载框,指定保存位置,双击目录则会进入该目录。

点击 Back 可以返回上一级目录 (向服务器发送 CWD ..),点击 Upload 会弹出文件选择框,指定要上传的本地文件,文件将被传到当前显示的目录,即 PWD 下,点击 Remove Dir 可以删除一个目录 (但不能删除文件),点击 Make Dir 将在当前显示的目录下创建新文件夹,点击 Rename 可以对当前选中的文件条目做重命名。PASV 和 PORT 按钮用于指定传输模式(默认为 PASV)。

不支持同时下载和上传及同时下载/上传多个文件,但客户端不会在下载/上传过程中假死,而是会在文件列表底部显示一个进度条以指示真实的下载进度。

窗口底部有一个显示客户端通信行为的日志窗口,方便在遇到问题时查看。

图 1: GUI 界面

二、技术细节及难点

2.1 Server

整体逻辑 主线程监听新的 Connect 到 21(default) 端口的 Tcp 连接请求,有则为它初始化一个 ClientSession 对象,并开辟子线程进入其事件循环。事件循环不断从命令端口阻塞式地读取客户端指令,每条指令经过 parser,判断合法性并调用对应 verb 的 handler,handler 内实现指令的具体逻辑,操作结束后进入读取下一条指令的等待。

Socket 读写 Socket 的读写操作全按阻塞处理。对于指令传输封装了 recvMsg 和 sendMsg 方法,以接受和发送以 为结尾的 request 及 response。对于数据传输封装了 sendRecv-Data 方法,在其内部进行数据连接的建立、数据发送与数据连接的关闭。

多客户端支持 一开始听文档说”A single threaded server is entirely adequate if you choose to use the select() call to implement multiple connections on your server.”,便兴致冲冲地用 select 写了第一版,遂发现所有 socket 连接和文件的 Handler 都是 FileDescriptor,需要附加很多信息来在 select 后区分它们以执行不同的操作,导致代码逻辑复杂,分支很多。

后来改用多线程,主线程监听指令端口是否有新的客户端连接请求,有则为该客户端单独创建一线程并进行对应的监听处理,与每个客户端的会话信息都保存在一个 ClientSession 结构中,与每个客户端的会话互不干扰,因此在逻辑上清晰许多,同时也避免了全局变量的使用,最终只有一个全局变量 serv 储存了必要的服务器相关的信息,避免了滥用全局变量的污染。

路径管理 用 serv.root 和 session.pwd 两个路径信息管理当前工作路径,前者记录了服务器工作的绝对路径,后者记录这个客户端相对于 root 的工作路径,最终用一个函数 produceAbsPath 组合二者及客户端传来的文件路径信息,生成一个可用的绝对路径,以供具体函数使用。如果路径不合法,则 produceAbsPath 返回负值指示调用者,以进行错误信息的处理,同时 root 的上级路径不会作为合法路径,以此保证合理的访问权限。

网络字节序 初期测试时,自己的测试脚本无论如何都连不上 server,参考网上实现后发现绑定地址时 IP 和 Port 没有通过对应的函数转义成网络字节序,导致绑定了错误的地址。

获取本机 IP 向任意公网服务器发包后 getsockname 获取 IP,为了稳定发包可以选用一些公共 DNS 服务器。

2.2 Client

整体逻辑 采用 PyQT 开发,程序整体是事件驱动的,点击某个按钮触发某个事件,再调用封装好的函数向服务器发消息即可。消息收发参考 Server,也对发送/接受指令做了封装,同时用装饰器实现了日志 (@message_log)、错误捕获 (@catch_exception) 和建立、销毁数据传输连接(@need_data_conn) 的逻辑。

参考文献

  • 基于Flex的虚拟实验平台研究(北京邮电大学·刘红亮)
  • 基于B/S结构的实盘训练营系统的设计与实现(华中科技大学·刘喆)
  • 基于云平台的网络虚拟实验课程系统(电子科技大学·李义成)
  • 网络流量统计分析系统(吉林大学·石景龙)
  • 基于.Net和Ajax技术的实验教学管理系统的设计和实现(苏州大学·周骏)
  • 基于MD5改进算法的安全教师博客系统设计及开发(湖南大学·刘曼春)
  • 基于云平台的网络虚拟实验课程系统(电子科技大学·李义成)
  • 项目管理中测试管理软件系统设计(电子科技大学·金亚敏)
  • 基于MD5改进算法的安全教师博客系统设计及开发(湖南大学·刘曼春)
  • 基于Docker容器的在线实验系统设计与实现(华中科技大学·毛少枫)
  • 基于Flex的虚拟实验平台研究(北京邮电大学·刘红亮)
  • 印刷公司内容管理平台的设计与实现(吉林大学·郎彩虹)
  • 数据库虚拟实验室的研究与实现(中南大学·杨瑛瑛)
  • 基于J2EE的远程网络教育系统研究与实现(电子科技大学·陈南荪)
  • 基于Flex的虚拟实验平台研究(北京邮电大学·刘红亮)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设小屋 ,原文地址:https://m.bishedaima.com/yuanma/35989.html

相关推荐

  • 新手python简单的飞机游戏

    game 一个新手做的python简单的飞机游戏 参考文献 基于Java EE的个人博客管理系统的设计和实现(内蒙古大学·闫伟光) 深度可定制的工具化爬虫系统的设计与实现(北京邮电大学·李笑语) 航空订票服务器爬虫检测技术研究(杭州电子科技大学·陈万烤) 主题爬虫关键技术研究(哈尔滨工程大学·黄正德) 机票票价预测系统设计与实现(大连理工大学·陈岩松) 深度可定制的工具化爬虫系统的设计与实现(北京邮电大学·李笑语) 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航) 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐) 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航) 机票票价预测系统设计与实现(大连理工大学·陈岩松) 山东航空货运业务管理系统的设计与实现(山东大学·高辉) 飞行情报资料管理信息系统设计与实现(中国地质大学(北京)·张晓琴) 山东航空货运业务管理系统的设计与实现(山东大学·高辉) 豆玩手机游戏平台的设计与实现(吉林大学·李天明) 面向高职信息技术教育的严肃游戏设计与实施(大连理工大学·王晓姝)
    2024年05月14日
    1 1 1
  • 基于python制作一个打砖块小游戏

    基于 python 制作一个打砖块小游戏 导语 想起来好久没更这个系列的文章了,周末过来补一波好了,本期我们将利用 python 制作一个打砖块小游戏
    2024年05月14日
    1 1 1
  • 基于python实现的电梯调度

    基于python实现的电梯调度 1 项目说明 1,1 项目目的 通过实现电梯调度,体会操作系统调度过程 学习特定环境下多线程编程方法 学习调度算法 1
    2024年05月14日
    5 1 3
  • 基于JSP的校园论坛BBS网站的设计与实现

    基于JSP的校园论坛BBS网站的设计与实现 1 概述 开发校园论坛系统的目的是提供一个供我校学生交流的平台,为我校学生提供交流经验,探讨问题的社区,因此
    2024年05月14日
    21 1 1
  • 基于SSM框架实现的员工信息管理系统

    1,项目简介 这是完整使用SSM框架开发的第一个项目,项目来源于北京动力节点的SSM框架整合教程,其中加入了一些自己的理解,增加了一个搜索功能的页面,这个项目总体来说对于新手是很友好的
    2024年05月14日
    2 1 1
  • 基于JSP的聊天器

    基于JSP的聊天器 1 可行性研究 1,1 技术条件方面的可行性 系统:Windows 8,1 Update 服务器环境:nodejs 0
    2024年05月14日
    7 1 1
  • 基于SpringBoot框架的在线互动学习网站

    这是一套采用Java语言,基于SpringBoot框架构建的在线教育互动平台的源代码,项目采用了SpringBoot和Vue技术栈,开发工具为Idea或Eclipse
    2024年05月23日
    5 1 3
  • 解谜类游戏之Python

    解谜类游戏 一,摘要 作者:霍禹佳,高铭星,朱子仪,梁鞍華 [摘要] 本作融合了企鹅,史诗英雄故事,解谜和游戏这四种元素,创造出一款全新的解谜类游戏,通过对故事
    2024年05月14日
    1 1 1
  • 基于Python制作愤怒的小鸟小游戏

    基于 Python 制作愤怒的小鸟小游戏 导语 小伙伴们周末愉快呀~楼主又好久没更新公众号的样子,为了避免继续被某些小伙伴吐槽,还是上来更新一波吧,既然是周末
    2024年05月14日
    6 1 2
  • 基于SpringBoot框架的网页时装购物系统

    这是一套采用Java语言开发的🔥🔥SpringBoot为核心的电商时装网站项目源代码🔥🔥,该项目运用了SpringBoot框架和Vue技术,支持在Idea或Eclipse开发环境中运行
    2024年05月23日
    10 1 2

发表回复

登录后才能评论