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 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
部署Python的框架下的web app的详细教程
Apr 30 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Django中提示消息messages的设置方式
Nov 15 Python
Python随机数函数代码实例解析
Feb 09 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
python 获取计算机的网卡信息
Feb 18 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通过字符串调用函数示例
2014/03/02 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python flask中静态文件的管理方法
2018/03/20 Python
NumPy 数组使用大全
2019/04/25 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
简单了解python的一些位运算技巧
2019/07/13 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
毕业生的自我鉴定
2013/10/29 职场文书
个人优缺点自我评价
2014/01/27 职场文书
超市创业计划书
2014/04/24 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python