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 05 Python
python web框架学习笔记
May 03 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
Jul 03 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
python中count函数简单用法
Jan 05 Python
Python 日期的转换及计算的具体使用详解
Jan 16 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 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/04 无线电
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
php Ajax乱码
2008/04/09 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
python实现磁盘日志清理的示例
2020/11/05 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
学生实习推荐信范文
2013/11/26 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
委托书怎样写
2014/08/30 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
详解分布式系统中如何用python实现Paxos
2021/05/18 Python