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中使用HTML模版的教程
Apr 29 Python
两个命令把 Vim 打造成 Python IDE的方法
Mar 20 Python
python线程、进程和协程详解
Jul 19 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
python实现远程控制电脑
May 23 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
python3.6使用SMTP协议发送邮件
May 20 Python
python脚本和网页有何区别
Jul 02 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
python实现canny边缘检测
Sep 14 Python
如何通过python计算圆周率PI
Nov 11 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 水平的题目
2007/05/30 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python3搜索及替换文件中文本的方法
2015/05/22 Python
Python如何为图片添加水印
2016/11/25 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python系列 文件操作的代码
2019/10/06 Python
基于python plotly交互式图表大全
2019/12/07 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
Eclipse面试题
2014/03/22 面试题
初中物理教学反思
2014/01/14 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
土地转让协议书
2014/09/27 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书