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 23 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
CentOS安装pillow报错的解决方法
Jan 27 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
Python中的类与类型示例详解
Jul 10 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
Python统计时间内的并发数代码实例
Dec 28 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python的scikit-image模块实例讲解
Dec 30 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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生成txt文件实例代码介绍
2016/04/28 PHP
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
js 函数性能比较方法
2020/08/24 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
Python正则捕获操作示例
2017/08/19 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python3爬取数据至mysql的方法
2018/06/26 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python如何获取文件路径/目录
2020/09/22 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
校园安全教育广播稿
2014/02/17 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
车间质检员岗位职责
2015/04/08 职场文书
创业计划书之甜品店
2019/09/18 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js