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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
Python中正则表达式的用法实例汇总
Aug 18 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
python数字图像处理实现直方图与均衡化
May 04 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
Python多进程fork()函数详解
Feb 22 Python
pandas如何处理缺失值
Jul 31 Python
python3 enum模块的应用实例详解
Aug 12 Python
Python如何读写二进制数组数据
Aug 01 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 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/02 国漫
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
C# .NET面试题
2015/11/28 面试题
保证书格式范文
2014/04/28 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
实习指导教师评语
2014/12/30 职场文书
小学远程教育工作总结
2015/08/13 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技