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的设计模式编程入门指南
Apr 02 Python
使用Python绘制图表大全总结
Feb 11 Python
Python实现购物系统(示例讲解)
Sep 13 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
Python通过socketserver处理多个链接
Mar 18 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
Python3爬虫中Ajax的用法
Jul 10 Python
详解python UDP 编程
Aug 24 Python
Python实现敏感词过滤的4种方法
Sep 12 Python
Pytorch 中的optimizer使用说明
Mar 03 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
php中cookie的作用域
2008/03/27 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
粗略分析Python中的内存泄漏
2015/04/23 Python
Python 装饰器深入理解
2017/03/16 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Python常见的pandas用法demo示例
2019/03/16 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
Python函数参数分类原理详解
2020/05/28 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
《狐假虎威》教学反思
2014/02/07 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python