Python socket模塊ftp傳輸文件過程解析
這篇文章主要介紹了Python socket模塊ftp傳輸文件過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
使用環(huán)境:python3,window環(huán)境,需要在頭部聲明# -*- coding:utf-8 -*-
實現(xiàn)功能:
將sever端所處文件夾的文件,傳輸?shù)絚lient端所處的文件夾中。
并且通過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: #一行一行發(fā)送數(shù)據,同時更新md5 m.update(line) #不斷更新md5 conn.send(line) #不斷發(fā)送數(shù)據。 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()) #發(fā)送命令,形式 get filename server_response = client.recv(1024) #接收文件大小信息 print("servr response:", server_response) client.send(b"ready to recv file") #發(fā)送確認信息。 file_total_size = int(server_response.decode()) #將文件大小int化。 received_size = 0 #初始化接收數(shù)據大小,為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()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
django框架model orM使用字典作為參數(shù),保存數(shù)據的方法分析
這篇文章主要介紹了django框架model orM使用字典作為參數(shù),保存數(shù)據的方法,結合實例形式分析了字典參數(shù)結合django model實現(xiàn)保存數(shù)據相關操作技巧,需要的朋友可以參考下2019-06-06OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡
很多時候通過ps可以做很多效果,今天我們來介紹使用OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡,具有一定的參考價值,感興趣的可以了解一下2021-06-06Python基于滑動平均思想實現(xiàn)缺失數(shù)據填充的方法
今天小編就為大家分享一篇關于Python基于滑動平均思想實現(xiàn)缺失數(shù)據填充的方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02Python計算標準差之numpy.std和torch.std的區(qū)別
Torch自稱為神經網絡中的numpy,它會將torch產生的tensor放在GPU中加速運算,就像numpy會把array放在CPU中加速運算,下面這篇文章主要給大家介紹了關于Python?Numpy計算標準差之numpy.std和torch.std區(qū)別的相關資料,需要的朋友可以參考下2022-08-08