实现一个简单的FTP(基于TCP)

前段时间动手写了自定义串口协议,写完之后感觉意犹未尽,于是想了想,貌似ftp我还没有去实现过,哪怕是一个简单的实例。

自己实现的ftp有很多问题:

  1.指令格式固定;

  2.不可以覆盖文件或者文件夹;

  3.查看子目录内容必须将该文件相对服务器所在路径加上,如查看目录A中子目录B的信息,则命令必须为"ls ./A/B";

  4.代码不够健壮;

  5.无用户登录;

  6.只支持一个客户端。

之所以有以上问题原因是空闲时间还是比较少,毕竟要把工作放在第一位,等之后再闲下来解决这些问题。

客户端和服务端如何进行发送指令和数据,两者又如何能够知道对方发送的数据是什么含义,这些问题需要在动手之间好好想想,千万不能上手就直接开干。

ftp功能其实很简单,就是上传文件和下载文件,那么就以这两功能来分别描述如何实现:

 

先说明两点:

  1. linux一切皆文件,所以文中说的文件既是文件也为文件夹;

  2.自己实现的ftp中如果上传或者下载是文件夹的话,服务端或者客户端会将该文件夹下的文件拆分开来一个一个发送(发送的文件名包含了该文件在顶层目录的相对路径)。

上传文件(Put File):

  1.客户端先向服务端发送"Put"来告知服务端,服务端发送"#PleasePutFile#"来通知客户端开始发送;

  2.客户端开始发送文件名"file:文件名",这样服务端就可以知道接下来客户端需要发送的文件名;

  3.当服务端知道客户端接下来发送的文件名时,服务端会先在自身路径下寻找是否存在相同文件名,如果存在服务端则返回字符串“#FileExist#”,而客户端收到之后将继续发送下一文件,若无文件则结束;

  4.若服务端没有客户端接下来发送的文件,服务端会创建并打开文件,并会发送指令"#PleaseTransmit#"来通知客户端开始发送文件内容,客户端发送完文件所以内容后会发送指令"#TransmitFinish#"来告知服务端文件内容已经全部发送完毕,同时等待服务端的应答指令"#Acknowledge#",之所以在这里加一个应答指令,是为了防止客户端不间断发送文件(若上传的是文件夹),客户端接收到服务端的应答指令后若还有文件需要发送则返回第二步继续发送下一个文件;

  5.若客户端无文件发送,则发送结束指令"#CommandFinish#"给服务端,服务端继续循环等下下一个客户端发来的指令。

下载文件(Get File):

  1.客户端直接发送指令"Get 文件名"给服务端,服务端接收到会解析出文件名进行判断,若服务端没有该文件,则发送指令"File not exit"给客户端;

  2.文件存在服务端发送“file:文件名”通知客户端接下来发送文件内容,客户端收到后会在自身路径下训在是否存在相同文件名,如果存在客户端返回字符串“#FileExist#”;

  3.若客户端自身不存在该文件,则回应“#PleaseTransmit#”,服务端则开始发送文件内容,文件内容发送完成之后会发送指令"#TransmitFinish#",这样客户端就明白文件内容已经获取成功,会发送应答指令"#Acknowledge#",若接下来还有文件需要下载(文件夹),则返回第二步其实循环获取文件;

  4.若服务端文件全部发送完后,则发送结束指令"#CommandFinish#"给客户端,服务端继续循环等下下一个客户端发来的指令。

思路其实基本一样,也比较简单,代码我等我封装好之后再上传。

猜你喜欢

转载自www.cnblogs.com/jiangyibo/p/9064308.html