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 相关文章推荐
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
python如何将图片转换为字符图片
Aug 19 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
快速查找Python安装路径方法
Feb 06 Python
Python Django路径配置实现过程解析
Nov 05 Python
PyQt5中QSpinBox计数器的实现
Jan 18 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
基于jquery实现多级菜单效果
2017/07/25 jQuery
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
python datetime中strptime用法详解
2019/08/29 Python
Python ATM功能实现代码实例
2020/03/19 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
社区党务公开实施方案
2014/03/18 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
公司介绍信范文
2015/01/31 职场文书
2015学校年度工作总结
2015/05/11 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Redis基本数据类型Set常用操作命令
2022/06/01 Redis