电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python實現(xiàn)ftp文件傳輸功能

瀏覽:46日期:2022-08-01 17:56:24

本文實例為大家分享了python實現(xiàn)ftp文件傳輸?shù)木唧w代碼,供大家參考,具體內(nèi)容如下

主要步驟可以分為以下幾步:

1.讀取文件名2.檢測文件是否存在3.打開文件4.檢測文件大小5.發(fā)送文件大小和 md5值給客戶端6.等客戶端確認(rèn)7.開始邊讀邊發(fā)數(shù)據(jù)

服務(wù)器端代碼:

import socket,os,timeimport hashlib server =socket.socket()server.bind((’0.0.0.0’,6666))server.listen()print('等待....')while True: conn,addr = server.accept() print('new conn:',conn) while True: data = conn.recv(1024) if not data: print('client is disconnection') break cmd,filename = data.decode().split() #記錄指令和文件名 print(filename) #判斷當(dāng)前目錄是否存在該文件,而且必須是文件,而不是目錄 if os.path.isfile(filename): f = open(filename,’rb’) #m = hashlib.md5() # 創(chuàng)建md5 file_size = os.stat(filename).st_size #stat() 可以返回文件的大小值 conn.send((str(file_size)).encode()) # 發(fā)送文件大小 conn.recv(1024) #等待返回信息 for line in f: # m.updata(line) conn.send(line) #print('file md5',m.hexdigest()) #打印md5值 f.close()

客戶端代碼:

# Author: zjtimport socket client = socket.socket() client.connect(('0.0.0.0',6666)) while True: cmd = input('>>>:').strip() if len(cmd)==0 :continue if cmd.startswith('get'): client.send(cmd.encode()) server_response = client.recv(1024) print('server response: ',server_response) client.send(b'ready to recv file') # 開始接收文件 file_total_size = int(server_response.decode()) received_size = 0 # 記錄接收文件的大小 filename = cmd.split()[1] # 因為兩個目錄一致,接收的文件名不能與原文件相同 f = open(filename+'.new','wb') while received_size < file_total_size: data = client.recv(1024) received_size += len(data) f.write(data) print('total:',file_total_size,' present: ',received_size) else: print('file has received done!') f.close() client.close()

用80M的文件傳輸測試,效果如下:

python實現(xiàn)ftp文件傳輸功能

程序升級:

前面的代碼還沒添加md5進行驗證,現(xiàn)在對代碼進行升級

服務(wù)器端代碼:

import socket,os,timeimport hashlib server =socket.socket()server.bind((’0.0.0.0’,8888))server.listen()print('等待....')while True: conn,addr = server.accept() print('new conn:',conn) while True: data = conn.recv(1024) if not data: print('client is disconnection') break cmd,filename = data.decode().split() #記錄指令和文件名 print(filename) #判斷當(dāng)前目錄是否存在該文件,而且必須是文件,而不是目錄 if os.path.isfile(filename): f = open(filename,’rb’) m = hashlib.md5() # 創(chuàng)建md5 file_size = os.stat(filename).st_size #stat() 可以返回文件的大小值 conn.send((str(file_size)).encode()) # 發(fā)送文件大小 conn.recv(1024) #等待返回信息 for line in f: m.update(line) conn.send(line) print('file md5',m.hexdigest()) #打印md5值 f.close() conn.send(m.hexdigest().encode()) # 發(fā)送md5 print('我真的已經(jīng)發(fā)過去了',m.hexdigest().encode()) print('send done') server.close()

客戶端代碼:

import socketimport hashlibclient = socket.socket()client.connect(('0.0.0.0',8888))while True: cmd = input('>>>:').strip() if len(cmd)==0 :continue if cmd.startswith('get'): client.send(cmd.encode()) server_response = client.recv(1024) print('server response: ',server_response) client.send(b'ready to recv file') # 開始接收文件 file_total_size = int(server_response.decode()) received_size = 0 # 記錄接收文件的大小 filename = cmd.split()[1] # 因為兩個目錄一致,接收的文件名不能與原文件相同 f = open(filename+'.new','wb') m = hashlib.md5() while received_size < file_total_size: data = client.recv(1024) received_size += len(data) m.update(data) f.write(data) #print('total:',file_total_size,' present: ',received_size) else: new_file_md5 = m.hexdigest() print('client file md5:',new_file_md5) print('file has received done!') print('total:',file_total_size,' present: ',received_size) f.close() sever_file_md5 = client.recv(1024) print('client file md5:',new_file_md5) print('server file md5:',sever_file_md5)client.close()

兩個程序在linux 環(huán)境下運行,結(jié)果如下:

python實現(xiàn)ftp文件傳輸功能

可以看到傳輸后文件大小變大了一點點,而且md5前后值也不同,說明文件傳輸發(fā)生了改變。

現(xiàn)在講程序在windows環(huán)境下運行,結(jié)果如下:

python實現(xiàn)ftp文件傳輸功能

此時可以看到windows上沒有問題,文件大小相同,且md5值也一致。

原因分析:

之所以會發(fā)生這種情況,是因為在linux上運行時,最后一次傳輸文件與發(fā)送md5值的時候,發(fā)生可粘包,導(dǎo)致最后一次接收文件的時候,連同md5的數(shù)據(jù)一并發(fā)送了。而客戶端也當(dāng)作一條接收信息,全部接收了。所以客戶端出現(xiàn)沒有收到來自服務(wù)器端的md5值,多出來的那一點點,就是md5值的大小。

解決方法:

在接收文件的時候,判斷當(dāng)前剩余多少文件需要接收,如果大于1024,就接收1024大小的文件,否則就只接收剩下全部的文件,防止最后一次接收多余的數(shù)據(jù)。

只需要對客戶端代碼進行修改,修改后代碼如下:

import socketimport hashlibclient = socket.socket()client.connect(('0.0.0.0',8888))while True: cmd = input('>>>:').strip() if len(cmd)==0 :continue if cmd.startswith('get'): client.send(cmd.encode()) server_response = client.recv(1024) print('server response: ',server_response) client.send(b'ready to recv file') # 開始接收文件 file_total_size = int(server_response.decode()) received_size = 0 # 記錄接收文件的大小 filename = cmd.split()[1] f = open(filename+'.new','wb') m = hashlib.md5() while received_size < file_total_size: #添加一次判斷,使最后一次剩多少就接收多少,避免發(fā)生粘包 if file_total_size - received_size > 1024: size = 1024 else: # 最后一次,剩多少收多少 size = file_total_size - received_size data = client.recv(size) received_size += len(data) m.update(data) f.write(data) else: new_file_md5 = m.hexdigest() print('client file md5:',new_file_md5) print('file has received done!') print('total:',file_total_size,' present: ',received_size) print('下一句關(guān)閉文件') f.close() print('開始接收md5 ') sever_file_md5 = client.recv(1024) print('client file md5:',new_file_md5) print('server file md5:',sever_file_md5)client.close()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 超声波_清洗机_超声波清洗机专业生产厂家-深圳市好顺超声设备有限公司 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 焦作网 WWW.JZRB.COM | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 除甲醛公司-甲醛检测-广西雅居环境科技有限公司 | 湖南自考_湖南自学考试 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | OpenI 启智 新一代人工智能开源开放平台 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 光照全温振荡器(智能型)-恒隆仪器 | 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 江苏大隆凯科技有限公司 | 锥形螺带干燥机(新型耙式干燥机)百科-常州丰能干燥工程 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 道康宁消泡剂-瓦克-大川进口消泡剂供应商 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 |