首页 / PYTHON / Python之ftp服务器
Python之ftp服务器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python之ftp服务器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4147字,纯文字阅读大概需要6分钟。
内容图文
![Python之ftp服务器](/upload/InfoBanner/zyjiaocheng/839/fb8987c3d745405ea37a96a6aa198129.jpg)
今天把做的ftp服务器过程总结一下,先看看要求
一.需求
1. 用户加密认证
2. 允许同时多用户登录
3. 每个用户有自己的家目录 ,且只能访问自己的家目录
4. 对用户进行磁盘配额,每个用户的可用空间不同
5. 允许用户在ftp server上随意切换目录cd
6. 允许用户查看当前目录下文件ls
7. 允许上传put和下载get文件,保证文件一致性
8. 文件传输过程中显示进度条
附加实现的功能:
1.实现服务器端文件删除,创建、删除目录
2.查看当前账户状态
3.实现断点续传
二.实现过程解析
1.客户端在登录的时候,密码不能用明文,以保证连接的安全性。以我现在的水平也就是把密码用hashlib里的md5转成密文一下。不过这个过程可以最后在做,前期调试过程可以用明文。
2.a使用socketserver做多并发来保证多个用户同时登录。我在socketserver里演示了socketserver的多并发的使用。
b在服务器端db文件夹内存有各个账户的文件。文件用josn的格式存储了账户的信息。
{"user_id":"admin","password":"123","totle_space":100000000,"stat":false}
c账户内有个key:used_space是每次登陆时候生成的,在每次put操作和rmdir/remove后都会重新获取已用空间的值。最初用的是os.stat().st_size获取,但获取不到文件夹的占用空间。做了个这样的函数
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958832.jpg)
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958944.jpg)
1 def get_path_size(self,path): 2 size = 0 3 for root, dirs, files in os.walk(path): 4 for f in files: 5 size += os.path.getsize(os.path.join(root, f)) 6 return sizeget_size
用这个方法,在文件量比较大的时候效率会比较低,高效的方法还没想好,看看以后还能改不!
3.在服务器端有个User的文件夹,文件夹内有各个用户的子文件夹。用户可以在客户端内进行目录的切换。这里是个很重要的地方:
a.用os.popen或者os.system()来执行cd的指令,是个深坑(特别是在linux内,一运行,就重新启动个terminal,然后就关闭了)
b.如果用chdir()的话,其实是改变了socketserver的工作目录,要是chdir('root')就相当有了root用户的权利,绝对不能用。
c.所以要切换目录,也就是不能切换,我在cmd的字典里加了个user_path的值,put、get都是在这个目录下进行的
d.每次登录后,直接进入该用户的路径:,每次用cd切换路径时,改变cmd_dic['user_path']的值。,刚好cd后有个空格,把空格后的字符赋值给cmd_dic['filename'],在服务器端根据这个值是'..'还是具体的路径进行相对应的操作。
e.在进行cd..时,应该注意最终只能到用户的家目录下。
f.在用os.popen('ls').read()时,返回的是该运行的.py所在文件夹下的文件,应该加上cmd_dic['user_path']的路径。
4.在conf文件夹下把所有的指令集做一个文件。把所有的操作对应的指令都存在这个文件内。这个指令集应该在服务器端,在登陆后发送给客户端。(这个暂未实现)
5.在实现put功能时,用了tkinter.filedialog弹窗选择文件的功能。
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958832.jpg)
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958944.jpg)
1 import tkinter.filedialog 2 file = tkinter.filedialog.askopenfilename() 3 print(file)弹窗选择文件
打印输出的就是文件的路径,但是有个问题还不知道原因,这里获取的文件路径的分隔符用的是'/'(系统是windows)。
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958832.jpg)
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958944.jpg)
C:\Users\Aaron\AppData\Local\Continuum\anaconda3\python.exe D:/python/homework/homework_ftp/ftp_client/test.py C:/Users/Aaron/Desktop/UnderstandingGIL.pdf 注意下方的运行结果,文件分隔符用的是'/' Process finished with exit code 0运行结果
还有,这个tkiner的对话框在pycharm内单独调试的过程没什么问题,但是放在客户端的代码内每次运行完对话框不自行关闭,手动关闭就会卡死然后报出python未响应的错误(不关闭程序倒是能正常运行)在terminal内也不行。在不知道是不是库里的文件有问题。
6.在显示进度条的时候,思路是这样的:
a.由于每次发送接收都是逐行发送的,就会有filesize和receivedsize,两个一除,在乘100后取整就好(当时忘记了×100,由于是个百分数取整以后一直都是0)
b.进度条显示是这样的
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958832.jpg)
![Python之ftp服务器 - 文章图片](/upload/getfiles/0001/2021/5/6/20210506062958944.jpg)
1 import sys,time 2 for i in range(50): 3 sys.stdout.write("#") 4 sys.stdout.flush() 5 time.sleep(0.1)进度条
c.如果在每次接收时都显示一遍进度,会有很多重复的数据,我做了个判断,如果进度变化,就flush一遍,否则不再输出。
三.文件结构
程序分为上图中的结构,其实core中的main里涵盖了几乎所有的功能,功能多了以后在修改时候过于繁琐,其实应该把各个功能封装好另存在core文件夹下,再导入到main中(主要时偷懒了,因为开始写程序的时候是第一个功能就是写在main里的,后面就没改)。
后期可以更改的部分:
1.把main程序分解
2.改进进度条的显示
3.修改tkiner的对话框卡死的bug
4.把指令集放在server端
最后,把项目的代码放在云盘上了!代码地址,提取码:fvso
内容总结
以上是互联网集市为您收集整理的Python之ftp服务器全部内容,希望文章能够帮你解决Python之ftp服务器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。