Python socket模块ftp传输文件过程解析


Posted in Python onNovember 05, 2019

这篇文章主要介绍了Python socket模块ftp传输文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

使用环境:python3,window环境,需要在头部声明# -*- coding:utf-8 -*-

实现功能:

将sever端所处文件夹的文件,传输到client端所处的文件夹中。

并且通过md5检测是否出错。

客户端命令的形式是: get 文件名

client处的新文件是 文件名.new

ftp_sever.py

import hashlib
import socket ,os,time
server = socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
  print("I am waiting for connection.")
  conn, addr = server.accept()
  print("new conn:",addr)
  while True:
    print("等待新指令")
    data = conn.recv(1024)
    if not data:
      print("客户端已断开")
      break
    cmd,filename = data.decode().split()
    print(filename)
    if os.path.isfile(filename):  #判断是否该文件名为文件
      f = open(filename,"rb")
      m = hashlib.md5() #为md5准备
      file_size = os.stat(filename).st_size #利用os.stat获取文件的大小
      conn.send( str(file_size).encode() ) #send file size
      conn.recv(1024) #等待确认,同时可以防止粘包。
      for line in f: #一行一行发送数据,同时更新md5
       m.update(line)  #不断更新md5
       conn.send(line) #不断发送数据。
      print("file md5", m.hexdigest()) #十六进制的md5
      f.close()
      conn.send(m.hexdigest().encode()) #send md5
    print("send done")
server.close()

ftp_client.py

import socket
import hashlib

client = socket.socket()

client.connect(('localhost', 9999))

while True:
  cmd = input(">>:").strip() #形式 get filename
  if len(cmd) == 0: continue
  if cmd.startswith("get"):
    client.send(cmd.encode()) #发送命令,形式 get filename
    server_response = client.recv(1024) #接收文件大小信息
    print("servr response:", server_response)
    client.send(b"ready to recv file") #发送确认信息。
    file_total_size = int(server_response.decode()) #将文件大小int化。
    received_size = 0 #初始化接收数据大小,为0
    filename = cmd.split()[1] #获取文件名
    f = open(filename + ".new", "wb") #以二进制形式写入
    m = hashlib.md5() #为md5准备

    while received_size != file_total_size:
'''下面的if判断是用来完整接收文件,从而避免粘包。'''
if file_total_size - received_size > 1024: # 要收不止一次 24 size = 1024 25 else: # 最后一次了,剩多少收多少 26 size = file_total_size - received_size 27 print("last receive:", size) 28 data = client.recv(size) #data只需要是一小个内存,大小为1k就好 29 received_size += len(data) 30 m.update(data) #不断更新md5 31 f.write(data) #不断写入 32 # print(file_total_size,received_size) 33 else: 34 new_file_md5 = m.hexdigest() #获取十六进制的md5 35 print("file recv done", received_size, file_total_size) 36 f.close() 37 server_file_md5 = client.recv(1024) #接收md5值 38 print("server file md5:", server_file_md5) 39 print("client file md5:", new_file_md5) 40 41 client.close()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
介绍Python的Urllib库的一些高级用法
Apr 30 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
python画图把时间作为横坐标的方法
Jul 07 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
tensorflow 模型权重导出实例
Jan 24 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 #Python
Python socket模块方法实现详解
Nov 05 #Python
基于python3 的百度图片下载器的实现代码
Nov 05 #Python
Python hashlib模块加密过程解析
Nov 05 #Python
python set集合使用方法解析
Nov 05 #Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 #Python
python中删除某个元素的方法解析
Nov 05 #Python
You might like
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
原生js实现购物车
2020/09/23 Javascript
Django查询数据库的性能优化示例代码
2017/09/24 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
pycharm修改file type方式
2019/11/19 Python
python3中rank函数的用法
2019/11/27 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
python实现四人制扑克牌游戏
2020/04/22 Python
python开发前景如何
2020/06/11 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
市场安全管理制度
2014/01/26 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
党校毕业个人总结
2015/02/28 职场文书
2015初中团委工作总结
2015/07/28 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS