准備工作,實現文件上傳需要那些工具呢?
socket(傳輸)、open()(打開文件)、os(讀取文件信息),當然還有輔助類sys和json,下面我們開始吧
import socket,sys import json,os #創建socket對象 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #獲取本地主機名 host = socket.gethostname() #設置端口號 port = 9000 #綁定端口 server.bind((host,port)) #設置最大連接數 server.listen(5) #建立連接 while True: print('開始監聽') #建立客戶端連接 clint,addr = server.accept() print("連接地址: %s" % str(addr)) #接收文件屬性數據,創建文件 jsonObj = json.loads(clint.recv(1024).decode('utf-8')) print('接收到數據',jsonObj) if not jsonObj : os.mknod(jsonObj['name']) msg = json.dumps({'name':'消息','信號':'創建成功'}) #回數據確認已經建立新文件 clint.send(msg.encode('utf-8')) #接收數據 size = 0 sizeValue = int(jsonObj['size']) print('開始接收數據') with open(jsonObj['name'], 'wb') as file: while size < sizeValue: value = sizeValue - size if value >1024: getdate = clint.recv(1024) else : getdate = clint.recv(value) file.write(getdate) size += 1024 print('結束') #關閉連接 clint.close()
客戶端
'''發送文件 Usage: clint.py <name> [<rename>] ''' import socket import os,json,sys #建立json數據,包含文件名以及大小 #{name:name,size:99999} date = {} if len(sys.argv) == 2: print(type(sys.argv[1])) name = sys.argv[1].split('\\')[-1] date['name'] = name else: date['name'] = sys.argv[2] date['size'] = os.path.getsize(sys.argv[1]) jsonString = json.dumps(date).encode('utf-8') #create connection clint = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 獲取本地主機名 host = socket.gethostname() # 設置端口好 port = 9000 # 連接服務,指定主機和端口 clint.connect((host, port)) #發送文件屬性信息 clint.send(jsonString) #接收服務端發過來的確認信息 clint.recv(1024) #發送文件數據 size = 0 with open(sys.argv[1],'rb') as file: while size < date['size']: fileDate = file.read(1024) clint.send(fileDate) size += 1024 #關閉連接 clint.close()