{"id":23940318,"url":"https://github.com/hongfz16/minimum-ftp","last_synced_at":"2026-06-09T20:31:21.455Z","repository":{"id":112761400,"uuid":"154126853","full_name":"hongfz16/minimum-ftp","owner":"hongfz16","description":"A simple ftp server and client which only implement minimum function.","archived":false,"fork":false,"pushed_at":"2018-11-21T02:39:11.000Z","size":63034,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-11-14T21:28:41.524Z","etag":null,"topics":["ftp","ftp-client","ftp-server","pyqt5"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hongfz16.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-10-22T10:44:17.000Z","updated_at":"2025-04-13T21:38:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"f5194bec-5b13-4349-904e-ac3963ddfade","html_url":"https://github.com/hongfz16/minimum-ftp","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/hongfz16/minimum-ftp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfz16%2Fminimum-ftp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfz16%2Fminimum-ftp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfz16%2Fminimum-ftp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfz16%2Fminimum-ftp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hongfz16","download_url":"https://codeload.github.com/hongfz16/minimum-ftp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hongfz16%2Fminimum-ftp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34125332,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ftp","ftp-client","ftp-server","pyqt5"],"created_at":"2025-01-06T03:14:49.042Z","updated_at":"2026-06-09T20:31:21.450Z","avatar_url":"https://github.com/hongfz16.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FTP课程实验报告\r\n\r\n## 作者信息\r\n\r\n- 姓名：洪方舟\r\n- 班级：软件62\r\n- 学号：2016013259\r\n\r\n## 实验目标\r\n\r\n- 完成一个符合RFC959标准的FTP服务器，并且支持能够提供最低限度服务的命令\r\n- 完成一个符合RFC959标准的FTP客户端，支持的命令与服务器端相对应\r\n- 在完成基本命令的基础上\r\n  - 服务器端需要支持：多客户端连接；非阻塞的大文件传输；断点续传；\r\n  - 客户端需要提供GUI界面\r\n- 通过本次实验，理解网络协议的重要意义，掌握网络编程的基础技能\r\n\r\n## 实验环境\r\n\r\n### 服务器端\r\n\r\n- Ubuntu 16.04\r\n- GCC 7.3.0\r\n\r\n### 客户端\r\n\r\n- Ubuntu 16.04\r\n- Python 3.7\r\n\r\n## 实验结果概述\r\n\r\n### 服务器端\r\n\r\n- 目前实现的命令如下所示：`USER,PASS,RETR,STOR,QUIT,SYST,TYPE,PORT,PASV,MKD,CWD,PWD,LIST,RMD,LIST,RMD,RNFR,RNTO,REST,APPE`\r\n- 通过多线程的方式做到多客户端同时访问\r\n- 通过多线程的方式做到大文件非阻塞传输，并且可以做到多文件同时上传、下载\r\n- 通过`REST,APPE`等命令实现断点续传\r\n\r\n### 客户端\r\n\r\n- 实现的命令与服务端一致\r\n- 使用`pyqt`提供GUI\r\n- 通过多线程的方式支持多文件同时上传、下载\r\n- 支持断点续传（也即暂停下载/继续下载/断网后的恢复）\r\n\r\n## 客户端运行指南\r\n\r\n### 环境准备\r\n\r\n- 安装`pyqt`：`pip3 install PyQt5==5.11.3`\r\n- 运行：`python3 ftp-gui.py`或者执行`bin`文件夹中的可执行文件\r\n\r\n### 使用说明\r\n\r\n- 运行后进入主界面，从上到下依次为：登录相关输入框；所发指令以及接受服务器返回值的显示框；本地文件夹以及远端文件夹；下载、上传任务列表\r\n- 首先请在登录相关输入框中依照提示输入正确的信息，点击右侧`Connect`后即可登录，登录后点击`Disconnect`即可退出登录\r\n- 如需浏览远端文件夹，可以上下滚动查看远端文件列表，如需进入文件夹只需双击对应项\r\n- 如需下载文件，请在左侧栏进入下载文件的保存文件夹，在右侧栏右击需要下载的文件，点击`Download`即可开始下载文件\r\n- 如需上传文件，请在右侧栏进入上传文件的保存地址，在左侧栏右击需要上传的文件，点击`Upload`即可开始上传文件\r\n- 所有的上传下载文件任务会显示在最下层的任务列表中，如需暂停/继续下载，请点击对应项右侧的按钮\r\n- 如需进入`Binary`模式，请点击左上角菜单栏中`File-\u003eMode`，选中`Binary`模式即可\r\n- 如需查看服务器系统，请点击菜单栏中`About-\u003eSystem`，在弹出的窗口中可以查看系统信息\r\n\r\n## 服务端运行指南\r\n\r\n### 环境准备\r\n\r\n- 在一台Linux/MacOS系统的电脑上安装`GUN make`以及`GUN gcc`\r\n- 在对应文件夹中运行`make`即可完成编译\r\n\r\n### 使用说明\r\n\r\n- 可执行文件`server`一共接受三个参数\r\n- `-port`指定了监听的端口号\r\n- `-root`指定了FTP根目录地址\r\n- `-host`指定了FTP服务器本机IP地址\r\n\r\n## 实验中遇到问题及其解决方案\r\n\r\n- 使用`pthread`时绑定端口的正确方式是`addr.sin_port=htons(port)`，如果不使用`htons()`函数转化则无法绑定正确的端口\r\n- 传输指令的`socket`在读数据的时候需要判断数据结尾是否为`\\r\\n`，以此作为判断一次传输完成的依据；而传输数据的`socket`在读数据的时候如果在某一时刻读到的数据长度为0，则说明另一端的`socket`被关闭，因而判断为传输完成\r\n- 多用户的实现方案如下：使用非阻塞的`socket`循环调用`accept()`，如果遇到连接，则新建一个线程，传入套接字文件描述符、根目录地址等必要的信息\r\n- 大文件传输的实现方案如下：每当需要文件传输的时候就新建一个线程进行文件传输，主线程仍然能够继续接受其他的命令；在大文件传输的线程中，如果是上传数据，则应当每读取一段数据就往文件中写一段数据，如果是下载文件，应当每从文件中读取一段数据就发送一段数据（客户端同理）\r\n- 断点续传的实现方案如下：\r\n  - 断点上传文件：先使用`LIST`指令读取上次上传的文件目前的大小，将本地文件对应的文件指针后移到对应的续传位置，使用`APPE`命令直接将剩余数据追加到远端的文件后\r\n  - 断点下载文件：先读取本地下载到一半的文件大小，使用`REST`命令告知远端跳过前若干字节，使用`RETR`命令下载剩余数据，并追加到对应的文件后\n\n## 创新点\n- 在实现大文件传输非阻塞的时候，没有限制数据传输套接字的数量，对于每一个用户维护了一个套接字列表，因此本服务器支持多文件同时上传，同时下载\n- 由于没有数据传输套接字数量的限制，因此本服务器在传输文件的时候能够支持`LIST`命令，实现了真正的大文件传输非阻塞\n- 客户端配合服务器端实现了上传、下载任务队列，能够做到多文件同时上传下载","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhongfz16%2Fminimum-ftp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhongfz16%2Fminimum-ftp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhongfz16%2Fminimum-ftp/lists"}