基于类FTP的自定制协议下的同步云系统

这是一个能够实现在不同主机之间传输文件(上传或者下载)的同步云系统,在这个系统中可以实现客户端中对制定目录下文件的监控以及在自定制协议下往对端传送文件,在服务器中可以接收对端传输文件并且对传输的文件进行备份,并且支持用户登陆系统。

FTP功能简介
我们这个服务器是基于FTP协议的自定制协议,那么我们很有必要在开始前了解一下FTP的相关知识,什么是FTP,FTP的工作原理等。

什么是FTP
ftp(File Transfer Protocol)文件传输协议。ftp是应用层协议,基于C/S结构,底层使用TCP/IP协议来保证可靠性。 ftp使得主机间可以传输文件。
ftp服务的基本过程是建立连接,发送数据与释放连接,相比HTTP协议来说省去了很多控制信息,同时ftp传输量较大,因此在设计ftp的时候使用了两种方式,分别是控制连接与数据连接,所以ftp有两个端口,一个用来传输命令,一个用来传输数据。

FTP工作原理
ftp有两种工作模式。分别是主动模式(PORT)与被动模式(PASV),主动模式下客户端发送PORT命令到服务器,被动模式下客户端发送PASV命令到服务器。

主动模式:在PORT模式下,服务器20与21端口工作,首先客户端与服务器的21端口建立连接,并且发送PORT告诉服务器是主动模式,PORT命令中包含了客户端接收数据的端口,服务器接收到命令后通过20端口发送数据,客户端用PORT中的协议端口接收。
被动模式:在被动模式下,服务器21端口与客户端端口先建立连接,然后服务器随机打开一个大于1023的高位端口,然后告诉客户端要是交互数据这个端口就是数据端口。
那么为什么要有两种模式呢,首先主动模式对服务器的管理有利但是对于客户端的管理很不方便,因为防火墙可能将高位端口阻塞掉,在被动模式下对于两方的管理都不有利,因为两边的数据端口都是高位端口,那么被动模式的优点在哪里呢,当服务器需要并发操作的时候,由于20端口只有一个,所以主动模式下只能有一个ftp连接服务器,但是在被动模式下由于数据传输端口是高位随机端口,所以就可以并发操作。

云同步系统
在了解完基础的ftp知识后,我们进入我们今天的主角,云同步系统。
首先从宏观来说,我们要实现的最基础的功能是文件传输,我们这里并没有用上述的ftp协议,而是用了自定制协议,并且我们需要实现客户端的对目录的监控以及利用自定制协议将文件传输至对端
从技术角度来说,我们需要实现的功能有:

对指定下目录进行文件监控
利用自定制协议传输文件
网络编程以及多路转接
线程池以及线程安全
该系统的设计分为四个主要的模块,如下图所示: 

目前我们需要实现的文件模块有客户端,服务器,共有数据,日志文件,线程池,主文件,下面将根据这个顺序来介绍云同步系统。

客户端文件
首先我们来看客户端中实现的功能,客户端主要是监控指定目录下文件状态的变化,将发生改变的文件添加到文件名队列,然后文件传送模块根据文件名传送文件。
所以客户端 = 监控模块+文件名队列+文件上传模块


文件监控
在linux下可以利用inotify特性对文件状态进行监控,包含在include <sys/inotify.h>文件下
简单来说inotify可以添加监控目录,并且对指定的目录进行监控,然后当发生指定事件的时候将文件存入指针,下面是inotify的基本接口介绍:

我们根据上面介绍的linux下inotify接口封装成文件,再用一个start函数暴漏给外面方便调用,当监控的目录下有文件发成了写完成后关闭时将该文件的文件名加入文件名队列

文件上传
在监控目录下文件后,在文件名队列中会有需要上传的文件名名称,接下来就需要将文件名交给文件上传模块将文件发送给对端。
根据客户端当前状态,分别调用不同处理方式:运行起来后默认处于1状态;客户端登陆成功后,循环处于3~5状态
客户端状态:

发送登陆请求状态
等待登陆回复状态
发送上传请求状态
发送文件数据状态
等待上传回复状态
由于服务器支持用户登陆系统,所以客户端先向服务器发送登陆信息,接着发送自定制协议头,其中包括要接受的文件大小以及文件名,当服务器接收到上述数据报后构建响应,客户端接收到响应后发送文件主体,由于数据报报头中有要发送的文件大小所以不会产生tcp粘包问题,当发送完毕后要是还有下一个要发送的文件在向服务器发送同步状态。

服务器文件
我们这里由于是自定义服务器端口,所以可以支持并发操作,服务器提供与客户端进行交互并且将上传的文件进行备份
服务端=登陆验证模块+登陆成功客户端队列+文件接收备份模块


登陆验证
当一个客户端需要上传文件的时候,首先他会发送登陆验证信息给服务器,服务器收到信息后将该客户端信息添加到登陆成功队列中,服务器与客户端一样有五个状态分别是:

等待接收登陆请求状态
发送登陆认证回复状态
等待接收上传请求状态
接收文件数据状态
发送文件上传回复状态
文件备份
文件备份模块中首先我们最核心的工作是接收对端传送的文件完成文件备份,我们这里使用多路转接中的epoll模型,将连接成功队列中客户端节点加入到epoll的监控队列中然后完成不同的工作。

共有数据文件
在共有数据中我们主要是针对客户端与服务器都需要用到的数据结构做出定义
首先我们需要客户端与服务器的状态信息做出统一规范,如下:

其次在传输文件中,我们需要针对文件的信息做出约束以及登陆信息等,并且根据传输的过程做出数据层面的约束,其中包括传输的自定义格式等


同时我们需要封装tcp的接口方便使用并且需要在这个文件中提供文件名队列的封装

日志文件
日志文件是为了方便调试以及追踪服务器客户端的运行动态所创建的文件,其中根据服务器以及客户端中出现的模块完成信息以及错误信息分成了INFO与ERROR两种等级,并且所设定的函数后面支持错误文件以及行号,错误信息描述等因素,加入日志文件方便调试以及动态追踪。

线程池文件
线程池是为了方便多线程管理所创建的,在线程池中有任务的概念,当任务队列中有任务出现的时候,任务队列就会派发任务给空闲的线程,如果没有空闲的线程那么就等待在条件变量上,直到出现空闲的线程就派发任务,这里主要是给服务器的登陆验证模块以及备份模块应用线程池(这里其实有一个小bug,待改,这里其实是应该应用进程池,一个进程里包括两个模块的线程,然后传输给进程一个sock)
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值