Python學習---網絡文件上傳
阿新 • • 發佈:2018-07-29
pat family jpg roc lba conn input 最大 socket
中心思想: 傳遞過去文件的大小,根據文件的大小判斷是否文件上傳完成; 傳遞/接受文件采用分流的形式,每次傳遞/接受部分數據; 文件的讀取均采用絕對路徑實現,而且是bytes的形式讀寫
客戶端:
# 客戶端 import socket import os # family=AF_INET, 代表使用IPV4的IP協議 # type=SOCK_STREAM 代表使用TCP協議進行連接 client = socket.socket() ip_addr = (‘127.0.0.1‘, 9999) BasePath = os.path.dirname(os.path.abspath(__file__)) while True: client.connect(ip_addr) inp = input(‘>>>:‘) # post | hhh.jpg cmd, path = inp.split(‘|‘) path = os.path.join(BasePath, path) filename = os.path.basename(path) file_size = os.stat(path).st_size file_info = ‘%s|%s|%s‘ % (cmd, filename, file_size) client.sendall(bytes(file_info, ‘utf-8‘)) file_send = 0 with open(path, ‘rb‘) as f: while file_send != file_size: data = f.read(1024) client.send(data) file_send += len(data) print(‘上傳成功!‘) client.close() break client.close()
服務器端:
# 服務端 import socket import subprocess import os # family=AF_INET, 代表使用IPV4的IP協議 # type=SOCK_STREAM 代表使用TCP協議進行連接 server = socket.socket() # 創建socket ip_addr = (‘127.0.0.1‘, 9999) # 1024之前的端口,默認是OS使用 server.bind(ip_addr) # 要求必須是一個元組 server.listen(3) # 開始監聽傳入連接。在拒絕連接之前,可以掛起的最大連接數量。 BasePath = os.path.dirname(os.path.abspath(__file__)) while True: conn, addr = server.accept() # 接受連接並返回(conn,address) # 其中conn是新的套接字對象[客戶端],可以用來接收和發送數據。 # address是連接客戶端的地址。 while 1: data = str(conn.recv(1024), ‘utf-8‘) cmd, file_name, file_size = data.split(‘|‘) path = os.path.join(BasePath, ‘hhh‘, file_name) file_size = int(file_size) rec_size = 0 with open(path, ‘ab‘) as f: while rec_size != file_size: data = conn.recv(1024) rec_size += len(data) f.write(data) print(‘接受成功!‘) break conn.close() server.close()
Python學習---網絡文件上傳