软73 沈冠霖 2017013569
客户端通过一个循环将0-50发给服务器,服务器初始化seq为0,然后每收到一个就更新seq,将收到的数据和seq发回去就可以了。
USER,PASS进行登录
PASV,PORT进行被动,主动模式连接
STOR,RETR下载和传输,REST断点续传
文件操作 LIST,CWD,MKD,RMD,PWD,RNFR,RNTO
其余的SYST,TYPE,QUIT,ABOR
每接收到一个链接请求,客户端就多开一个线程来处理, 进入处理指令的主函数。
接收到RETR,STOR指令并且连接数据连接后,多开一个线程进行数据传输。同时,为了方便管理数据传输,把当前连接状态,连接类型,文件名,文件大小,开始位置等存入一个结构体进行操作。
CWD,MKD,RMD,PWD,重命名指令等用C语言的各种函数实现,参考了这个网页。
LIST指令通过调用linux命令行实现,使用popen函数调用ls -l指令获取文件信息,参考了这个网页。
客户端使用pyqt5在ubuntu16.04中实现。
点击按钮后连接服务器的IP和端口,然后发送USER,PASS指令登录。
计算出对应的文件名或目录,然后发送对应的指令
连续发送PASV和LIST获取数据,然后提取对应的文件信息。使用QTableWidget进行显示,同时使用Qt.CustomContextMenu实现了右击显示菜单功能,便于对单一文件/文件夹进行操作。
用QTableWidget进行显示,用SetCellWidget方法设置里面的单元格是按钮和进度条,也用这个方法进行更新。
下载连续发送PASV,RETR两个指令进行。为了不阻塞客户端,用QThread多开一个线程来接收数据,用信号-槽机制更新进度条,参考了这个网页。在传输中如果用到涉及数据连接的其他指令会报错。
更新全局变量来暂停传输,客户端切断socket连接,并且记录当前传输的大小。此时服务器能通过read/write接口的-1返回值捕捉到错误,返回错误码,接收错误码即可暂停。
然后连续发送PASV,REST,RETR/STOR来进行断点续传。
发送QUIT指令。
这次大作业,我了解了Socket api,FTP协议,以及pyqt5的使用方法。主要遇到的困难是如何不阻塞进程进行上传,下载,这个用多线程实现;还有pyqt5的各种操作也让我费了很大劲。感谢从业臻同学的帮助,也感谢王泽宇学长提供客户端设计参考。