一种P2P 分布式文件共享方式的实现与优化

2019-08-20 07:27刘睿任晓慧于波
现代计算机 2019年20期
关键词:服务器端客户端监控

刘睿,任晓慧,于波

(聊城大学计算机学院,聊城252000)

0 引言

当代社会步入一个高速发展的时代,科技发达、信息流通,人们之间的交流越来越密切,信息资源也成为国家发展、社会进步的重要战略资源,信息的传播与分享成为创造效率的必要条件。文件作为互联网信息传输常用载体之一,其分发传输在内容分发网络、P2P 网络等方面都有比较成熟的研究和应用成果。而在日常教学及工作中,经常需要将规模小的信息以文件的方式快速分发出去,距离近(如位于同一局域网中的办公室之间或者教室、机房内),如何提高工作效率以及办公质量是本文所设计文件共享方式的初衷。目前也有许多学者进行过相关的研究,文献[1]中研究实现了一种基于Python 语言的分布式文件共享系统,本文同样采用Python 语言编程,实现了分布式文件共享的功能,并在其基础上进行了优化设计:通过写入数据库表的形式,实现对分享条目的动态修改和对无效信息的及时清除,减少数据冗余;通过利用系统的体系监控机制,实现针对常见系统平台(包括Windows 及Linux等)的动态监控。最终可实现:加入网络环境中的每一个成员,都成为信息的发布者和分享者,快速分发,提高工作效率。

在日常的办公及学习时,常见的文件共享方式一般有以下几种[1]:通过现代商业办公体系和一些即时通讯工具进行传输;建立FTP 协议的服务器进行文件共享;通过邮箱发送邮件的形式;使用存储设备拷贝共享等。这些传输方式类型多样,各有利弊,但共同点是都借用了第三方工具,获取效率有所影响。本文设计实现的分布式文件共享方式特点为:实时查看,实时下载,方便快捷。该共享方式将网络中内部成员需要传递的文件信息加入到共享系统中来,要想获得这些信息,其他客户端只需以网页的形式使用关键字搜索即可快速实现。

1 设计思路介绍

1.1 相关概念

Peer-to-Peer(简称P2P,即对等方式技术)[2-3],是小型局域网常用的组网方式。其可以定义为:网络的参与者共享他们所拥有的一部分硬件资源,这些共享资源通过网络提供服务和内容,能被其他对等节点(Peer)直接访问而无需经过中间实体。在此网络中的参与者既是资源、服务和内容的提供者,又是资源、服务和内容的获取者。

本文所设计的P2P 文件共享方式属于集中式P2P网络共享方式[2]。Peer 同时具有Client 和Server 的特点,可以直接通信和文件传输[4]。

选择使用Python 语言进行服务器端、客户端程序设计,是因为Python 语言是一种语法简洁优美、功能强大、应用领域广泛,具有强大完备的第三方库的一种可移植、可扩展、可嵌入的解释型编程语言。Python 语言诞生于1990 年,由Guido van Rossum 设计并领导开发,目前是一种被广泛使用的高级通用脚本编程语言[5-6]。它的特点是:语法简洁、与平台无关,有优异的可扩展性;Python 语言提供了丰富的内置类库和函数库,可以大量利用已有的内置或第三方代码,能够轻量级地完成各种任务,用于编写各领域的应用程序。Python 语言相对简洁、开发效率高、易于维护,目前已经成为众多科研领域使用的科学计算工具[7],具有广阔的应用空间。使用Python 语言进行设计,可充分享受其代码简洁,语义容易理解的优势,缺点在于运行速度稍慢,代码不能加密等,对于实用的小程序来讲,此点可忽略。

1.2 系统功能介绍

本文系统的实现方式如下:在同一局域网或可以互相访问的虚拟局域网中,用户通过运行程序将PC 上用于分享的文件夹设置为共享,应用程序将主动扫描该文件夹下所有文件,生成文件树并提交到管理系统中,使用超文本传输协议(HTTP)的形式进行共享和展示;对于文件搜索,由主机提供Web 程序,以网页形式进行交互式操作。其他网络用户可在智能终端使用通用的搜索入口进行查询,若能找到可根据需要进行下载使用。为方便说明,本文将所有使用本系统的电脑终端称之为客户端,负责承担搜索任务的电脑终端称为服务器端。服务器端承担的搜索任务可以通过使用与客户端相同的体系来实现。具体工作流程图如图1 所示。

图1 总体流程图

2 系统主要功能实现

本文系统功能的实现,分为客户端、服务器端两部分分别设计。

根据客户端实现的功能,采用模块化及逐层封装思想,将文件操作,数据库操作及网络操作逐层封装,具体分为以下几个类进行功能实现:FileTools 文件操作类、DbTools 数据库操作类、Monitor 文件改动监控类、ClionHttp 服务类、Config 配置文件。作为与文献[1]的比较,本文着重改进的地方在于DbTools 数据库操作类与Monitor 文件改动监控类两部分的设计,下面对每个功能类的实现技术点进行说明。

2.1 FileTools文件操作类

按照系统设计,客户端需有能力获取用户设置为共享文件夹下的所有文件及路径,故在文件操作类FileTools 中实现获取所有文件的方法,通过逐层递归遍历实现所有文件的记录,并同时记录下文件所在具体位置。

for num in range(len(filelist)):

returndirstr +=creatfile.getfilelist(filepath + '/' + filelist[num])

if os.path.isdir(filepath+'/'+filelist[num]):

else:

returnfilestr+=filepath+'/'+filelist[num]+' '

returnstr+=returnfilestr+returndirstr

为了使文件的路径信息转换为对HTTP 服务的有效URL 路径,故在文件操作类中集成URL 转换方法,实现由共享文件夹的相对位置转化为Web 服务的有效路由信息:

list = list.replace(path, "http://" + str(ip)+ ':' + str(PORT)).spli(t' ')

通过Python 标准库中字符串替换方法,高效生成HTTP 服务分享连接。同时为实现获取客户端IP 功能,使用UDP 报文头抓取方法,该方法相比使用标准库GETIP()等内置功能的实现方法,更能高效地在客户机用于两个及以上IP 地址时,自动判别内网IP,实现IP 定位功能。

2.2 DbTools数据库操作类

针对客户端所需的数据库操纵能力,在比较多种实现技术后,使用对象关系映射技术(Object-Relational Mapping,ORM)[8],作为将本体(Ontology)文件存储到关系型数据库中的一种可借鉴的方法。通过在数据库和代码业务应用层中间加入数据持久化层,避免直接对数据库进行操作,避免如SQL 注入等常见的Web 攻击方式,并且通过对数据域的对象化,可以方便的进行面向对象的数据元操作。将SQL 语句中的关系型联系转化为源类对象之间的交互。

在具体的Python 语言中,类似的ORM 框架有很多种[8][9],如SQLObject、Storm、Peewee 等。针对客户端的特点,选取Peewee 的Python ORM 框架,简单小巧,且容易学习。

由于客户端向服务器端提交数据,故设计数据库表如下:

time 提交时间

ip 提交内网IP name 文件名称

filename http 分享连接

使用Peewee 建立数据表模型:

class ip_file_url(BaseModel):

time=CharField()

ip=CharField()

name=CharField()

filename=CharField(max_length=500)

针对客户端具体功能要求,实现了对数据库的增、删功能。通过调用FILETOOLS 模块获得文件的名称和HTTP 分享路径,转换成具体的数据库条目,并调用Peewee 中的insert_many()方法,插入到服务器端数据表中。针对共享目录下文件修改或文件增加、删除问题,统一使用数据表删除方法,删除掉本IP 提交的所有信息,并将新的文件共享项目表提交到服务器数据库中。通过这种方法,来实现对共享条目的动态修改和对无效信息的及时清除,减少数据冗余。

2.3 Monitor文件改动监控类

在文件分布式分拣存储系统中,最重要的是实现文件信息的动态更新。因为在实际使用中,用户可能会对文件进行不定时的更新,为了保证数据的实时性及在整个文件分享系统中的可靠性,就需要实现对特定文件夹的实时监控。当用户对分享文件夹中的文件进行操作时,系统要及时更新系统数据库中文件树,来保证数据完整性。在开发中为了保证跨平台及兼容性,通过封装系统信号量监控机制,来实现对不同平台(包括Windows、Linux、Mac OS 等)的文件操作的实时监控。

具体而言,使用Python 编程,通过对watchdog 模块的扩展来实现,用来监控指定目录/文件的变化:

watchdog.events.FileCreatedEvent()

文件被创建时触发该事件

watchdog.events.DirCreatedEvent()

目录被创建时触发该事件

watchdog.events.FileDeletedEvent()

文件被删除时触发该事件

watchdog.events.DirDeletedEvent()

目录被删除时触发该事件

watchdog.events.FileModifiedEvent()

文件被修改时触发该事件(修改文件内容、修改文件inode 信息如权限和访问时间,都会触发该事件)

watchdog.events.DirModifiedEvent()

目录被修改时触发该事件

通过对watchdog 事件处理类的重构及继承,来实现针对文件共享目录的实时监控,每当有文件操作发生在设定的共享目录时,系统就能根据具体的文件操作类型,实时扫描文件修改,并通过FileTools 及Db-Tools 实时同步到服务器端数据库中。

2.4 ClionHttp服务类

因为客户端要根据需求,使用HTTP 服务分享客户端文件,又要降低对系统的负荷,减小对CPU 及磁盘I/O 影响,故使用Python 标准库中自带的http.server模块,实现了一个小型、符合预期的HTTP 服务程序。

WEBDIR=path

PORT=config.http_prot

os.chdir(WEBDIR)

Handler=SimpleHTTPRequestHandler

with socketserver.TCPServer(('', PORT), Handler)as httpd:

print("serving at port",PORT)

httpd.serve_forever()

通过os.chdir()方法,将当前路径切换到设定的共享文件目录上,来实现HTTP 服务的高效运行。

2.5 Config文件

通过创建Config 文件,将一些需要根据情境来更改的属性绑定到一起,减少修改代码的复杂性,当用户在自行部署时,可以统一地在Config 文件中修改具体参数,如数据库账号信息、开放端口信息等,避免对代码的文正行的修改和破坏[10]。

2.6 服务器端

服务器端需要给用户提供一个完善的UI 交互界面,满足用户的可视化操作要求,结合本系统的应用需求,决定使用Web Server 形式提供给用户类似搜索引擎的文件查询界面。针对本项目,建立了一个名为server 的Django App 应用。

建立数据层

class files(models.Model):

time=models.CharField(max_length=100)

ip=models.CharField(max_length=100)

name=models.CharField(max_length=500)

filename=models.CharField(max_length=500)

class Meta:

db_table='ip_file_url'

来定义数据操纵的表结构,为后续数据操作实现类定义。

定义两个方法Headhtml(),Inquire()来完成系统操作。Headhtml()来完成用户访问本系统时,返回查询首页面的功能,当用户在窗口中输入要查询的文件名称时,通过post 方式提交到后台,而Inquire()方法用来接受用户的查询参数,并使用models 中定义的数据表进行对数据库的查询操作。

class MyFormView(View):

form_class=MyForm

template_name='result.html'

def post(self,request,*args,**kwargs):

form=self.form_class(request.POST)

if form.is_valid():

form=files.objects.filter(name_iexact=names)

return render(request, self.template_name, {'form':form})

当在数据库中查询到具体条目时,主动渲染到result 模板中,并返回给用户。

针对网络安全问题,尤其是在表单提交时的跨域攻击问题,特地在网页模板中添加{%csrf_token%}标签,使用{%csrf_token%}生成一个input 框在form 表单中提交,每次post 请求提交有需要Django 生成的csrftoken 值,来防范跨域攻击问题。

3 系统实现

在同一局域网中的多台办公电脑上进行了系统测试,其中一台电脑启动服务器端服务。图2 和图3 分别显示在客户端电脑进行文件搜索及找到相关文件后的画面,可以看到本文系统的实现效果如图2。

图2 文件搜索

图3 文件下载

4 结语

本文使用Python 语言编程,实现了整个分布式文件共享系统的功能,优化设计的地方主要有:通过写入数据库表的形式,实现对分享条目的动态修改和对无效信息的及时清除,减少数据冗余,保证信息的准确性。使用系统监控机制,实现针对常见系统平台的动态监控,使得该共享方式适用于各种系统平台。用户只需要运行客户端程序,随时都可以加入到文件共享的队伍中,其他的网络用户通过搜索,即可获取相应的文件。该方式实现简单有效,可满足于各种办公、教学环境使用,是一种可推广的文件共享方式。

算法过程简洁明了,易于理解。系统实现部分给出了较直观的图,显示了系统运行时的共享文件搜索及文件下载界面。关于系统安全[11]及文件搜索过程中模糊查询、内容查询等细化方面的工作,可作为下一步的研究方向。

猜你喜欢
服务器端客户端监控
你的手机安装了多少个客户端
“人民网+客户端”推出数据新闻
——稳就业、惠民生,“数”读十年成绩单
The Great Barrier Reef shows coral comeback
冬奥项目训练监控方法的研究——TRIMP、sRPE在短道速滑训练监控中的应用
基于无人机的监控系统设计
基于量化的风险监控预警机制探索与实践
Linux环境下基于Socket的数据传输软件设计
基于Qt的安全即时通讯软件服务器端设计
基于Qt的网络聊天软件服务器端设计
媒体客户端的发展策略与推广模式