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中实现两个字典(dict)合并的方法
Sep 23 Python
跟老齐学Python之关于循环的小伎俩
Oct 02 Python
Python使用py2exe打包程序介绍
Nov 20 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
Python selenium抓取微博内容的示例代码
May 17 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
pyinstaller还原python代码过程图解
Jan 08 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python 制作本地应用搜索工具
Feb 27 Python
django中websocket的具体使用
Jan 22 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去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
2014年大学生工作总结
2014/11/20 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书