朱亚林 纪宏伟
摘 要:大数据时代,信息的分享与传播越来越受到重视。人们更加专注于提高信息的分享效率、提升信息的传播速度。在日常工作中,组建一个开放的自主式、智能式、有着较强安全性能的文件共享系统,可以大幅提高工作效率,节约工作成本。本文将借助于Python语言,采用分布式程序设计理念搭建一个文件共享的网络平台,这即是对传统文件共享形式的一种补充,也是一次创新与尝试。
关键词:Python;分布式;文件共享系统;自主;智能
中图分类号:TP393.0 文献标识码:A 文章编号:2095-2163(2015)04-
Implementation of A Distributed File Sharing System based on Python
ZHU Yalin, JI Hongwei
(Nantong Normal College, Rugao Jiangsu 226500,China)
Abstract: In the era of big data,information sharing and communication is getting more and more attention.People are more focused on improving the efficiency of information sharing and improving the speed of information transmission. In daily work, an open autonomous, intelligent file sharing system with the strong performance of safety, can greatly improve the work efficiency, and save the cost of work. This article will use the Python language, adopting the distributed application design concept to build a file sharing network platform, which is not only a supplement to the traditional form of file sharing, but also is an innovation and try.
Keywords :Python; Distributed; File Sharing System; Autonomous; Intelligent
0 引 言
大数据时代,信息的传播与分享是创造效率的必要条件,也是人与人之间交流与协作的不可或缺的最佳途径。在此环境之下,每条信息及其背后的各种介质,其实都是大数据的重要组成部分,如果能将这些对象科学合理地纳入到数据环境中来,会得到意想不到的效果。因此,无论在日常生活还是研究工作中,人们都必须学会运用大数据的思维来探讨解决问题。
在工作中,各类文档的传递交换是常规普通的频发现象。一般的处理方式不外乎以下几种:借助于单位的OA系统和QQ等即时通工具进行传输、通过Email进行收发、通过云空间进行分享、建立FTP站点进行共享、利用U盘拷贝分享等等[ ]。以上的传输手段,类型多样,也各有利弊,此处暂且不对其各自所有的特性进行分析评价。本文研究实现的基于Python语言的一种分布式文件共享系统,则是可以作为上述各种共享方式的补充。可以说,该系统融入了大数据背景下数据处理的理念,将一个团体内部的所有成员,都看作是数据的发布者与获得者,即如同搭积木一样地将其各自所拥有的数据加入到共享环境中来,而要想获得这些数据,则只需一个关键字搜索即可实现。
1分布式文件共享系统的设计思路
所谓分布式文件共享是指,所有可检索的共享文件不存在于固定的服务器上,而是分布于加入该文件共享环境中的各台独立的计算机上[ ][ ],该环境中的用户既是数据的提供者,也是数据的获取者。
整个系统的设计思路如下:首先,该环境中的用户会根据实际情况设置一个用于共享的文件夹,系统会自动提交共享目录结构,并将该目录进行共享;其次,用户可以依托一个通用的搜索入口,在布设于该环境范围内的所有计算机的共享目录中进行检索,并下载所需要的文件。为方便说明,下文将所有加入分布式文件共享系统的独立计算机称之为客户机,而负责承担搜索任务的计算机称为服务器。
1.1 客户机配置
要加入该分布式文件共享系统,则需要在客户机上安装客户端软件,该软件主要负责如下方面功能的实现:
(1) 获取共享目录结构
允许用户设置本台电脑上用于共享的文件夹,客户端会自动扫描共享文件夹的目录结构,并将其进一步反馈给服务器,以利于共享情况的实时更新。
(2) 实现文件及文件夹的共享
客户端还有一大功能即是将共享文件或文件夹以HTTP协议的形式共享和展示,以方便其他用户浏览、下载。之所以选择HTTP服务,是因为实现协议的服务平台搭建简单,运行环境跨平台,且无需下载软件支持,而只需配有浏览器即可完成。
1.2 服务器配置
系统的服务器端,其主要功能是用于收集各个客户端发来的目录索引,并将其保存到统一文件夹下,同时为用户提供一个搜索的接口用于文件检索,当用户输入关键字时,则在各个成员提供的共享目录索引中进行检索,并给出反馈结果,进而引导用户到指定地址下载文件。
综上所述不难发现,该系统的优势在于:在某一局域网内部,再也不必配备专门的服务器来存储规模庞大的共享数据了,成员与成员之间可以根据实际需要,将自己计算机上的公用文件处于共享状态,方便他人获取;而且用户自身则可以保留原版文件,同时拥有对所属文件的更新权,使其无论何时均处于最新状态。从另一个角度来看,这也意味着工作者使用的每台计算机都是共享服务器,大大降低了办公成本。
2分布式文件共享系统主要功能的实现
前文对该系统的实现原理与设计思路进行了分析与论述,本节内容将重点研究该系统中的主要功能模块实现。在此,将围绕目录信息的收集、HTTP服务器的创建、共享目录结构信息的发送与接收、搜索引擎核心功能的架构等四个方面来展开设计、并研发实现。而实现语言则采用时下非常流行的Python。Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言[ ]。该语言免费、跨平台,且有着强大的网络支持功能,非常适合用来实现本系统。
2.1遍历指定目录,以获取文件及文件夹
使用客户端软件来遍历共享目录中的文件与文件夹结构,是该系统实现的第一步。通过该功能,收集用户共享目录中的所有信息,将其保存为指定文件。而当用户目录中有文件或文件夹发生异动时,则再次触发遍历的功能,重新对目录进行扫描,并及时更新相应文件。因此,该部分功能可分为如下两步。
2.1.1 实现目录的遍历并保存目录信息
Python语言中遍历目录有多种方法,本程序中通过定义一个getfilelist函数来实现。通过getfilelist函数将共享目录中的文件及文件夹进行遍历,并按照具体的索引规则将目录结构分行存储到指定文件中。而用于存储目录结构的文件,则以本机的IP地址为文件名进行命名,以便于上传到服务器端时进行辨识。
以下是实现上述功能的部分代码。
(1)用于遍历指定目录的getfilelist函数
def getfilelist(filepath):
simplepath = os.path.split(filepath)[1]
returnstr = filepath+"\n"
returndirstr = ""
returnfilestr = ""
filelist = os.listdir(filepath)
for num in range(len(filelist)):
filename=filelist[num]
if os.path.isdir(filepath+"/"+filename):
returndirstr += getfilelist(filepath+"/"+filename)
else:
returnfilestr += filepath+"/"+filename+"\n"
returnstr += returnfilestr+returndirstr
return returnstr+"\n"
(2)用于生成索引文件的creatFile函数
def creatFile():
ip = socket.gethostbyname(socket.gethostname())
path = WEBDIR #此处路径在实际应用时,将传入用户设置的共享目录地址
usefulpath = path.replace('\\', '/')
if usefulpath.endswith("/"):
usefulpath = usefulpath[:-1]
if not os.path.exists(usefulpath):
print "path error"
elif not os.path.isdir(usefulpath):
print "it's not a path"
else:
filelist = os.listdir(usefulpath)
o=open("upload/"+ip+".xml","w+") #将生成的文件以本机IP地址为名,存放在程序的upload目录下,以备后续程序将其上传到服务器端
o.writelines(getfilelist(usefulpath).replace(usefulpath,"http://"+ip+PROT))
o.close()
print "successed"
通过以上函数生成的目录索引内容如图1所示。可以看到,所有共享文件都已经以URL的形式出现,方便使用者检索后按相应地址下载。
图1 Creatfile函数生成的文件预览
Fig.1 Creatfile function generated file Preview
2.1.2 监听目录变化
监听目录变化,就是在指定的共享目录中,当发生文件夹或者文件的删除、修改文件名以及新建对象等操作时,相应的程序就会执行动作,重新遍历目录,并生成目录列表文件。在此,给出是实现这一功能的实现代码具体如下。
import os
from creat import creatFile
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE,IN_MODIFY
wm = WatchManager()
mask = IN_DELETE | IN_CREATE |IN_MODIFY
class PFilePath(ProcessEvent):
def process_IN_CREATE(self, event):
print "Create file: %s " % os.path.join(event.path, event.name)
creatFile()
def process_IN_DELETE(self, event):
print "Delete file: %s " % os.path.join(event.path, event.name)
creatFile()
def process_IN_MODIFY(self, event):
print "Modify file: %s " % os.path.join(event.path, event.name)
creatFile()
if __name__ == "__main__":
notifier = Notifier(wm, PFilePath())
wdd = wm.add_watch('./../Documents', mask, rec=True)
while True:
try :
notifier.process_events()
if notifier.check_events():
notifier.read_events()
except KeyboardInterrupt:
notifier.stop()
break
2.2创建HttpServer,以Web形式共享指定目录
加入分布式共享系统的每台计算机都会是一台独立的文件分享服务器。因而为简便起见,此处将直接采用对平台无具体要求且广受关注的HTTP超文本传输协议。
基于设计方案,将在客户端上建立一个简单HTTP服务器,并将用户共享的目录处于该服务范围内,以方便其他用户通过HTTP协议下载共享文件。
利用Python语言建立HTTP服务非常简单,其实现代码具体如下[ ]。
import SimpleHTTPServer
import SocketServer
import os
WEBDIR = "/home/zz/Documents" #此处传入用户设置的共享目录
PORT = 8 000 #此处设置HTTP服务器的服务端口
os.chdir(WEBDIR)
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
此时,共享目录已经可以通过http://主机IP:8000的形式进行访问了。
2.3发送共享目录结构,以方便服务器进行文件检索
当一台计算机加入分布式共享系统后,客户端程序会自动索引共享目录中的文件夹与文件,并将其直接生成一个索引文件。此时要做的就是将该索引文件发送到服务器端,从而在后续环节中利于有关检索用途的实现。
在Python语言中,文件的传输可以使用其Socket模块来实现[4, ],具体也分为两个部分:一是客户机上的客户端负责发送指定文件;二是服务器端负责接收文件,并将文件存放到指定位置。以下将分别给出客户端与服务器端的实现代码。
2.3.1 客户端
在客户端的实现过程中,需要考虑的问题是:向谁发送文件,发送什么文件,最关键的则是怎样发送文件,以下给出的是用于向服务器端发送文件的sendfile函数。该函数将在每次createfile函数(即生成目录索引函数)运行后调用,以确保服务器端接收到的目录索引文件就是最新的版本。该功能实现的主要代码如下。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def sendfile(filename):
print "server ready, now client sending file~~"
f = open(filename, 'rb')
while True:
data = f.read(4 096)
if not data:
break
s.sendall(data)
f.close()
time.sleep(1)
s.sendall('EOF')
print "send file success!"
2.3.2 服务器端
服务器端只需要对指定端口进行侦听,当客户端得到发送文件的命令请求时,启动相应功能进行文件接收即可。具体功能实现的主要代码如下。
class MyTcpServer(SocketServer.BaseRequestHandler):
def recvfile(self, filename):
print "starting reve file!"
f = open(filename, 'wb')
self.request.send('ready')
while True:
data = self.request.recv(4 096)
if data == 'EOF':
print "recv file success!"
break
f.write(data)
f.close()
def handle(self):
print "get connection from :",self.client_address
while True:
try:
data = self.request.recv(4 096)
print "get data:", data
if not data:
print "break the connection!"
break
else:
action, filename = data.split()
if action == 'get':
self.sendfile(filename)
else:
print "get error!"
continue
except Exception,e:
print "get error at:",e
2.4建立主服务器搜索引擎,以实现分布式文件共享检索
当加入分布式共享系统的用户计算机向服务器提交了包含共享目录索引的文件后,接下来就将由服务器提供搜索反馈服务了。一般用户只需要在浏览器中输入服务器提供的搜索页面的地址,并在其提供的搜索页面中输入关键字,服务器就会在由各个客户机提供的索引目录的文件中进行检索。当符合条件的结果出现时,则由服务器给出反馈页面,同时提供转向相应结果的下载链接。
如何建立一个Web服务器以及提供一个包含搜索框的HTML页面在这里就不做赘述了,以下主要讨论当搜索关键字传入后,Python在包含有索引目录的文件中进行检索并反馈相应结果的过程。这里用到的主要是Python的文本处理功能,具体实现代码如下。
def search_result(filename,searchString):
#filename是指需要检索的文件名,searchString是用户传入的检索关键字
sys.setdefaultencoding('utf-8')
f = open(filename, 'rb')
s_s =searchString
result=''
for i in f:
if s_s in i:
result+=i.decode('utf-8')
return result
此时,只需调用search_result()函数,遍历包含索引目录文件的文件夹,传入索引文件名及关键字即可。
3分布式文件共享系统功能总结与展望
至此,一个基于Python语言的分布式文件共享系统已经成功实现。用户可以通过安装一个小的客户端,随时加入到文件共享的队伍中来,而其他使用者只需要通过一个简单的搜索功能,就可以获取到相应的文件。该系统与FTP相比更直观,与Email相比更快捷,与云协作软件相比更安全,与U盘拷贝相比效率大大提升,且共享数据规模则要远远超出以上各类方式。笔者以3颗星为满分进行评价,从获取效率、传输方式、共享范围以及数据安全性等四项共享指标出发,将其与时下常见的各类共享方式进行比较,得出的结果可参见表1。
表1各类文件共享形式比较(满分为三颗★)
Tab.1 Comparison of various forms of file sharing (out of three stars)
获取效率高 传输方式便捷 共享范围广 数据安全性高
Email ★ ★★ ★★ ★★★
FTP ★ ★★ ★★ ★
即时通软件 ★★★ ★★★ ★ ★★
云盘类软件 ★★★ ★★★ ★★ ★★
U盘 ★ ★ ★ ★★★
分布式共享 ★★★ ★★★ ★★★ ★★★
当然,当前设计的系统还只能通过文件名来进行检索,很多方面还不够完善,在后续功能拓展方面,可以加入文件内容检索、文件预览等功能,使得检索结果更为精准、而且更趋人性化,在检索算法上将会更加地优化,使之能适应企业级规模的发展需要。