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实现列表转换成字典数据结构的方法
Mar 11 Python
python正则分析nginx的访问日志
Jan 17 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
Jun 26 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
python 接收处理外带的参数方法
Dec 03 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
python爬虫容易学吗
Jun 02 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
Python编写nmap扫描工具
Jul 21 Python
python数字图像处理:图像简单滤波
Jun 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
几个学习PHP的网址
2006/11/25 PHP
php实现单链表的实例代码
2013/03/22 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php中session定期自动清理的方法
2015/11/12 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
PHP getName()函数讲解
2019/02/03 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
javascript 函数使用说明
2010/04/07 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
Angular的$http与$location
2016/12/26 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
Python监控主机是否存活并以邮件报警
2015/09/22 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
基于python使用tibco ems代码实例
2019/12/20 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
大学生村官事迹材料
2014/01/21 职场文书
国培教师自我鉴定
2014/02/12 职场文书
2014公司年终工作总结
2014/12/19 职场文书
2015年老干部工作总结
2015/04/23 职场文书
雷锋之歌观后感
2015/06/10 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python