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

 更新时间:2019年11月05日 11:38:16   作者:星辉笑  
这篇文章主要介绍了Python socket模块ftp传输文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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 合并/拆分Excel的实现示例

    Python 合并/拆分Excel的实现示例

    有时对于多个工作表需要进行合并或拆分,以便进行浏览总结,本文主要介绍了Python 合并/拆分Excel的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • django框架model orM使用字典作为参数,保存数据的方法分析

    django框架model orM使用字典作为参数,保存数据的方法分析

    这篇文章主要介绍了django框架model orM使用字典作为参数,保存数据的方法,结合实例形式分析了字典参数结合django model实现保存数据相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • python3.10及以上版本编译安装ssl模块的详细过程

    python3.10及以上版本编译安装ssl模块的详细过程

    最近搞安装ssl模块每天都弄到很晚,所以这里给大家整理下,这篇文章主要给大家介绍了关于python3.10及以上版本编译安装ssl模块的详细过程,文中介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • OpenCV-Python实现怀旧滤镜与连环画滤镜

    OpenCV-Python实现怀旧滤镜与连环画滤镜

    很多时候通过ps可以做很多效果,今天我们来介绍使用OpenCV-Python实现怀旧滤镜与连环画滤镜,具有一定的参考价值,感兴趣的可以了解一下
    2021-06-06
  • Python基于滑动平均思想实现缺失数据填充的方法

    Python基于滑动平均思想实现缺失数据填充的方法

    今天小编就为大家分享一篇关于Python基于滑动平均思想实现缺失数据填充的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • python验证多组数据之间有无显著差异

    python验证多组数据之间有无显著差异

    这篇文章主要介绍了python验证多组数据之间有无显著差异,利用方差分析和卡方分布验证多组数据之间的某些属性有无显著性差异,对于连续性属性可以用方差分析,对于离散型属性可以用卡方检验。下面文章详细内容需要的小伙伴可以参考一下
    2022-01-01
  • 通过python-turtle库实现绘制图画

    通过python-turtle库实现绘制图画

    turtle库是python的基础绘图库,经常被用来给孩子们介绍编程知识的方法库,是标准库之一,利用turtle可以制作很多复杂的绘图。本文将为大家介绍通过turtle库绘制的一些有趣的图画,感兴趣的小伙伴可以学习一下
    2021-12-12
  • 在cmd中查看python的安装路径方法

    在cmd中查看python的安装路径方法

    在本篇文章里小编给大家整理的是关于怎样在cmd中查看python的安装路径的相关内容,有兴趣的朋友们学习参考下。
    2019-07-07
  • Python绘图操作之turtle库乌龟绘图全面整理

    Python绘图操作之turtle库乌龟绘图全面整理

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形
    2021-10-10
  • Python计算标准差之numpy.std和torch.std的区别

    Python计算标准差之numpy.std和torch.std的区别

    Torch自称为神经网络中的numpy,它会将torch产生的tensor放在GPU中加速运算,就像numpy会把array放在CPU中加速运算,下面这篇文章主要给大家介绍了关于Python Numpy计算标准差之numpy.std和torch.std区别的相关资料,需要的朋友可以参考下
    2022-08-08

最新评论