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中的几种数据类型
Jan 02 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
Python中类的创建和实例化操作示例
Feb 27 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
python 标准差计算的实现(std)
Jul 29 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
Python3分析处理声音数据的例子
Aug 27 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Python调用C/C++的方法解析
Aug 05 Python
python 常见的反爬虫策略
Sep 27 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
多人战的战术与战略
2020/03/04 星际争霸
一个改进的UBB类
2006/10/09 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
Javascript的并行运算实现代码
2010/11/19 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
使用js画图之画切线
2015/01/12 Javascript
JavaScript入门基础
2015/08/12 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
django中的setting最佳配置小结
2017/11/21 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
python实现查找所有程序的安装信息
2020/02/18 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
厨房工作人员岗位职责
2013/11/15 职场文书
成品仓管员工作职责
2013/12/29 职场文书
药学专业个人的自我评价
2013/12/31 职场文书
给面试官的感谢信
2014/02/01 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
python 中的jieba分词库
2021/11/23 Python
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
Python内置数据类型中的集合详解
2022/03/18 Python