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获取邮件地址的方法
Jul 10 Python
Python的Django框架中的数据过滤功能
Jul 17 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
python递归查询菜单并转换成json实例
Mar 27 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
记录Python脚本的运行日志的方法
Jun 05 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
python异步Web框架sanic的实现
Apr 27 Python
python安装后的目录在哪里
Jun 21 Python
python获取命令行参数实例方法讲解
Nov 02 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
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
最佳JS代码编写的14条技巧
2011/01/09 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
Python文件及目录操作实例详解
2015/06/04 Python
python实现矩阵乘法的方法
2015/06/28 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
使用C++扩展Python的功能详解
2018/01/12 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
关于Django Models CharField 参数说明
2020/03/31 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
升职自荐书范文
2013/11/28 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
TypeScript 内置高级类型编程示例
2022/09/23 Javascript