python中的socket实现ftp客户端和服务器收发文件及md5加密文件


Posted in Python onApril 01, 2020

客户端向服务器发送一个请求,请求内容是一个文件名,服务器在查找自己这边有没有这个文件,如果有的话就发送给客户端

1、客户端

  1. 生成socket对象
  2. 建立连接
  3. 输入想要接收的文件
  4. 将输入的文件名发送给服务器
  5. 接收服务器发回的关于即将要发送来的文件的大小
  6. 发送一条信息给服务器告诉它准备好接收了
  7. 接收文件数据
  8. 打印全部接收的提示信息

client具体实现的代码如下:

# Author: Mr.Xue
# 2019.10.29
# socket_ftp_client.py

import socket
import hashlib

client = socket.socket() # 生成socket连接对象
client.connect(('localhost', 6961)) # 建立连接

while True:
 cmd = input(">>").strip() # 输入想要接收的文件
 if len(cmd) == 0: continue # 输入为空,重新再输
 if cmd.startswith('get'): # 判断指令是否以get开头
 client.send(cmd.encode("utf-8")) # 发送
 server_response = client.recv(1024) #接收即将发送来的文件的大小
 print("server response:", server_response) # 打印文件的大小
 client.send(b'ready to recv file...') # 发送消息告诉服务已经准备好接收了
 file_total_size = int(server_response.decode()) # 记录文件的总大小
 received_size = 0 # 记录已经接收了的文件的大小
 filename = cmd.split()[1] # 取出输入的文件名
 f = open(filename + '.new', 'wb') # 新建一个本地文件来存储接收的数据
 m = hashlib.md5() # md5加密
 while received_size < file_total_size:
  data = client.recv(1024) # 接收数据,一次最大接收1024bytes
  received_size += len(data) # 记录已接收的数据大小
  m.update(data) # 用md5加密
  f.write(data) # 写入文件
 else:
  new_file_md5 = m.hexdigest() # 16进制显示加密文件
  print("file recv done", received_size, file_total_size)
  f.close()
  server_md5 = client.recv(1024) # 接收服务器端以md5加密的这个接收文件的加密文件,拿来和接收之后的加密文件做比较
  print("md5", new_file_md5, server_md5)
client.close()

client端比较难的一点和上篇一样,还是如何判断服务器端要发送的数据,客户端是否完全都接收过来了,实现逻辑在上面代码中,也可参考前一篇socket(二);在客户端这一次多了一个新的知识点,用md5来加密接收到的文件,先生成md5实例对象,再调用update()来加密文件,最后和服务器端的加密文件进行比较,看看是不是一样的。

2、服务器

  1. 生成socket连接对象
  2. 绑定要监听端口
  3. 监听
  4. 等待客户端的连接
  5. 接收客户端发来的文件名
  6. 查找这个文件是否存在
  7. 如果存在,打开文件计算大小,发送给客户端
  8. 等待客户端确认
  9. 发送文件具体内容给客户端

server具体实现代码如下:

# Author: Mr.Xue
# 2019.10.29
# socket_ftp_server.py

import socket, os, hashlib

server = socket.socket() #生成socket对象
server.bind(('localhost', 6961)) # 绑定ip和端口
server.listen() #监听
while True:
 conn, addr = server.accept() # 等待客户端连接
 while True:
 print("等待接收文件名...")
 data = conn.recv(1024) # 接收客户端发来的信息
 if not data: #判断客户端是否断连
  print('lost a link...')
  break
 cmd, filename = data.decode().split() # 分割接收到的消息,提取出文件名
 if os.path.isfile(filename): # 判断文件是否存在
  f = open(filename, 'rb') # 打开文件
  m = hashlib.md5() # md5加密对象
  file_size = os.stat(filename).st_size # 计算文件大小
  conn.send(str(file_size).encode("utf-8")) # send file size
  conn.recv(1024) # wait the ack 预防粘包
  for line in f:
  m.update(line) # 加密
  conn.send(line) # 发送
  print("file md5:", m.hexdigest()) # 以16进制打印加密后的文件
  f.close() # 关闭文件
  conn.send(m.hexdigest().encode("utf-8")) # 以16进制发送加密后的文件
 print('send done')
socket.close()

服务器的具体实现逻辑和前一篇大体上没什么区别,主要处理细节诶变成了查找文件处理文件和加密文件

3、测试效果

启动服务器

xue@xue-MacBookAir:~/python_learn$ python3 socket_ftp_server.py

启动客户端

client

xue@xue-MacBookAir:~/python_learn$ python3 socket_ftp_client.py
>>

server

xue@xue-MacBookAir:~/python_learn$ python3 socket_ftp_server.py
等待接收文件名...

客户端发送想要接收的文件名

client

xue@xue-MacBookAir:~/python_learn$ python3 socket_ftp_client.py
>>get a.txt
server response: b'90'
file recv done 90 90
md5 2232897a127542c1d0715e66e7ca57cc b'2232897a127542c1d0715e66e7ca57cc'
>>

server

xue@xue-MacBookAir:~/python_learn$ python3 socket_ftp_server.py
等待接收文件名...
file md5: 2232897a127542c1d0715e66e7ca57cc
send done
等待接收文件名...

上面的服务器端在发送完数据之后,接着又发送了md5的加密文件,可能会发生粘包的情况,所以上面还存在改进的地方,将预防粘包的代码加进去就比较完美了。

总结

到此这篇关于python中的socket实现ftp客户端和服务器收发文件及md5加密文件的文章就介绍到这了,更多相关python socket 实现ftp 收发文件md5加密文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
利用 python 对目录下的文件进行过滤删除
Dec 27 Python
python版学生管理系统
Jan 10 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
pycharm 安装JPype的教程
Aug 08 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
python 监控logcat关键字功能
Sep 04 Python
在python中实现导入一个需要传参的模块
May 12 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
Apr 01 #Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 #Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 #Python
详解Python中pyautogui库的最全使用方法
Apr 01 #Python
django的模型类管理器——数据库操作的封装详解
Apr 01 #Python
opencv中图像叠加/图像融合/按位操作的实现
Apr 01 #Python
Django数据库操作之save与update的使用
Apr 01 #Python
You might like
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
python的Template使用指南
2014/09/11 Python
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
python生成密码字典的方法
2018/07/06 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
python实现动态数组的示例代码
2019/07/15 Python
Python中url标签使用知识点总结
2020/01/16 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
小学教师学期末自我评价
2013/09/25 职场文书
冰淇淋店创业计划书范文
2013/12/27 职场文书
初一学生期末评语
2014/04/24 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书