4.socket實現文件傳輸


目的:

通過服務端和客戶端的連接,用戶向客戶端發出命令post 文件名
然后客戶端系統根據os.path找到該文件的目錄,將文件傳輸到服務端固定的文件中

即用戶端將文件上傳到服務端的文件夾中

客戶端代碼:
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
BASE_DIR=os.path.dirname(os.path.abspath(__file__))  #當前文件夾的絕對路徑
print(BASE_DIR)
while 1:
    data=input('想要進行什么操作:(命令和文件之間用空格分開)').strip()
    cmd,path=data.split(' ')    #獲取命令和文件名
    path=os.path.join(BASE_DIR,path)  #拼接文件的完整路徑
    filename=os.path.basename(path)  #獲取文件名
    size=os.stat(path).st_size  #獲取文件大小
    file_info='post|%s|%s'%(filename,size)  #將文件的所有信息發送給服務端,以便服務端處理數據
    sk.sendall(file_info.encode('utf-8'))
    f=open(path,'rb')
    has_set=0
    while has_set!= size:    #如果已經發送的數據的大小小於文件大小,繼續發送
        data=f.read(1024)
        sk.sendall(data)
        has_set += len(data)
    f.close()
    print('結束')
服務端代碼:
import os
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)
print('waiting...')
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
while 1:
    con,add=sk.accept()
    while 1:
        data=con.recv(1024)
        cmd,filename,filesize=data.decode('utf-8').split('|')
        path=os.path.join(BASE_DIR,'yuan',filename)  #拼接出接收文件的存儲路徑,即程序目錄下的yuan文件夾里的filename文件
        filesize=int(filesize)  #需要接收的數據的大小
        f=open(path,'wb')
        has_get=0
        while has_get!=filesize: #如果已經接收的數據的大小不等於傳輸過來的文件大小,繼續接收數據
            data=con.recv(1024)
            f.write(data)
            has_get +=len(data)
        f.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM