廢話少說,直接上代碼
1 # 發送端 2 import socket,os 3 from struct import pack 4 5 def send_file(file_name,file_socket:socket.socket): 6 try: 7 f = open(file_name,'rb') 8 size = os.path.getsize(file_name) 9 if size < 1024: 10 read_size = 500 11 elif size < 1024*1024 and size >= 1024: 12 read_size = 500*1024 13 else: 14 read_size = 500*1024*1024 15 file_socket.send(pack('q',size)) 16 del size 17 file_socket.recv(1024) 18 while True: 19 data = f.read(read_size) 20 if not data: 21 break 22 file_socket.send(data) 23 f.close() 24 except FileNotFoundError: 25 print(f'沒有找到{file_name}') 26 27 if __name__ == '__main__': 28 try: 29 file_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 30 file_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) 31 ip = str(input('請輸入接收端IP:')) 32 port = int(input('請輸入接收端端口號:')) 33 file_socket.connect((ip,port)) 34 print('連接成功,准備開始傳輸。。。') 35 path = r'%s' % (input('請輸入文件所在文件夾:') + '/') 36 print(file_socket.recv(1024).decode('gbk')) 37 file_name = str(input()) 38 file_socket.send(file_name.encode('gbk')) 39 send_file(path + file_name,file_socket) 40 except ConnectionResetError: 41 print('接收端斷開連接')
1 # 接收端 2 import socket,os 3 from time import time 4 from struct import unpack 5 from tqdm import tqdm 6 7 DOWNLOAD_PATH = 'D:/Python文件傳輸/' # 傳輸目錄 8 9 def download(file_name,file_socket:socket.socket): 10 file_size = unpack('q',file_socket.recv(1024))[0] 11 if file_size < 1024: 12 print(f'文件大小:{file_size} B') 13 elif file_size < 1024*1024 and file_size >= 1024: 14 print(f'文件大小:{file_size/1024} KB') 15 else: 16 print(f'文件大小:{file_size/(1024*1024)} MB') 17 f = open(file_name,'wb') 18 print('開始傳輸...') 19 download_size = 2048 20 file_socket.send('開始傳輸'.encode('gbk')) 21 start = time() 22 for i in tqdm(range(int(file_size/download_size) + 1)): 23 data = file_socket.recv(download_size) 24 f.write(data) 25 end = time() 26 f.close() 27 print('傳輸完成!') 28 print(f'大約耗時{end - start}秒') 29 30 if __name__ == '__main__': 31 os.chdir(DOWNLOAD_PATH) 32 try: 33 file_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 34 file_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) 35 file_socket_port = int(input('請輸入端口號:')) 36 file_socket.bind(('',file_socket_port)) 37 print('成功啟動,等待連接。。。') 38 file_socket.listen(1) 39 f_socket, f_addr = file_socket.accept() 40 print(f'建立連接{f_addr}') 41 f_socket.send('請輸入文件名'.encode('gbk')) 42 file_name = f_socket.recv(1024) 43 download(file_name.decode('gbk'),f_socket) 44 f_socket.close() 45 file_socket.close() 46 except ConnectionResetError: 47 print('發送端已斷開連接') 48 except UnicodeDecodeError: 49 print('文件編碼錯誤,請檢查文件格式是否正確')