您好,登錄后才能下訂單哦!
python中怎么實現單線程文件傳輸,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
客戶端代碼:
#-*-encoding:utf-8-*- import socket import os import sys import math import time def progressbar(cur, total): percent = '{:.2%}'.format(float(cur) / float(total)) sys.stdout.write('\r') sys.stdout.write("[%-50s] %s" % ( '=' * int(math.floor(cur * 50 / total)), percent)) sys.stdout.flush() def getFileSize(file): file.seek(0, os.SEEK_END) fileLength = file.tell() file.seek(0, 0) return fileLength def getFileName(fileFullPath): index = fileFullPath.rindex('\\') if index == -1: return fileFullPath else: return fileFullPath[index+1:] def transferFile(): fileFullPath = r"%s" % raw_input("File path: ").strip("\"") if os.path.exists(fileFullPath): timeStart = time.clock() file = open(fileFullPath, 'rb') fileSize = getFileSize(file) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((targetHost, targetPort)) # send file size client.send(str(fileSize)) response = client.recv(1024) # send file name client.send(getFileName(fileFullPath)) response = client.recv(1024) # send file content sentLength = 0 while sentLength < fileSize: bufLen = 1024 buf = file.read(bufLen) client.send(buf) sentLength += len(buf) process = int(float(sentLength) / float(fileSize) * 100) progressbar(process, 100) client.recv(1024) file.close() timeEnd = time.clock() print "\r\nFinished, spent %d seconds" % (timeEnd - timeStart) else: print "File doesn't exist" targetHost = raw_input("Server IP Address: ") targetPort = int(raw_input("Server port: ")) while True: transferFile()
服務器端代碼:
#-*-encoding:utf-8-*- import socket import threading import os import sys import math bindIp = "0.0.0.0" bindPort = 9999 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((bindIp, bindPort)) server.listen(1) print "Listening on %s:%d" % (bindIp, bindPort) def progressbar(cur, total): percent = '{:.2%}'.format(float(cur) / float(total)) sys.stdout.write('\r') sys.stdout.write("[%-50s] %s" % ( '=' * int(math.floor(cur * 50 / total)), percent)) sys.stdout.flush() def checkFileName(originalFileName): extensionIndex = originalFileName.rindex(".") name = originalFileName[:extensionIndex] extension = originalFileName[extensionIndex+1:] index = 1 newNameSuffix = "(" + str(index) + ")" finalFileName = originalFileName if os.path.exists(finalFileName): finalFileName = name + " " + newNameSuffix + "." + extension while os.path.exists(finalFileName): index += 1 oldSuffix = newNameSuffix newNameSuffix = "(" + str(index) + ")" finalFileName = finalFileName.replace(oldSuffix, newNameSuffix) return finalFileName def handleClient(clientSocket): # receive file size fileSize = int(clientSocket.recv(1024)) # print "[<==] File size received from client: %d" % fileSize clientSocket.send("Received") # receive file name fileName = clientSocket.recv(1024) # print "[<==] File name received from client: %s" % fileName clientSocket.send("Received") fileName = checkFileName(fileName) file = open(fileName, 'wb') # receive file content print "[==>] Saving file to %s" % fileName receivedLength = 0 while receivedLength < fileSize: bufLen = 1024 if fileSize - receivedLength < bufLen: bufLen = fileSize - receivedLength buf = clientSocket.recv(bufLen) file.write(buf) receivedLength += len(buf) process = int(float(receivedLength) / float(fileSize) * 100) progressbar(process, 100) file.close() print "\r\n[==>] File %s saved." % fileName clientSocket.send("Received") while True: client, addr = server.accept() print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1]) clientHandler = threading.Thread(target=handleClient, args=(client,)) clientHandler.start()
運行結果示例:
服務器端:
客戶端(服務器端做了端口映射:59999->9999):
看完上述內容,你們掌握python中怎么實現單線程文件傳輸的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。