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自动登录126邮箱的方法
Jul 10 Python
详解Python中的array数组模块相关使用
Jul 05 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
Django中的文件的上传的几种方式
Jul 23 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
python三方库之requests的快速上手
Mar 04 Python
python里dict变成list实例方法
Jun 26 Python
Python求解正态分布置信区间教程
Nov 20 Python
Python selenium自动化测试模型图解
Apr 15 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
Python 字符串池化的前提
Jul 03 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
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python实现豆瓣图片下载的方法
2015/05/25 Python
Python实现图像几何变换
2015/07/06 Python
Python如何快速实现分布式任务
2017/07/06 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python实现自动登录后台管理系统
2018/10/18 Python
pycharm显示远程图片的实现
2019/11/04 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
合同意向书范本
2014/07/30 职场文书
运动会稿件100字
2014/09/24 职场文书
公司租房协议书
2014/10/14 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
公司周年庆典致辞
2015/07/30 职场文书