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 03 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
python如何查看微信消息撤回
Nov 27 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
Django的性能优化实现解析
Jul 30 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
PHP常用的小程序代码段
2015/11/14 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
JS中表单的使用小结
2014/01/11 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
JS中的BOM应用
2018/02/02 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
python字典操作实例详解
2017/11/16 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
对Django中内置的User模型实例详解
2019/08/16 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
捐款倡议书
2014/04/14 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
研讨会通知
2015/04/27 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android