目錄結構:
client:
#!/usr/bin/env python# -*-coding:utf-8 -*-import socket, struct, jsondownload_dir = r'D:/Python/python_learning/gd/code/part3/02網絡編程/文件傳輸/client/download'gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)gd_client.connect(('127.0.0.1',8123))
while True:
#1、發命令 cmd=input('>>: ').strip() #get a.txt if not cmd:continue gd_client.send(cmd.encode('utf-8')) #2、以寫的方式打開一個新文件,接收服務端發來的文件的內容寫入客戶的新文件 #第一步:先收報頭的長度 obj=gd_client.recv(4) header_size=struct.unpack('i',obj)[0] # 第二步:再收報頭 header_bytes = gd_client.recv(header_size) # 第三步:從報頭中解析出對真實數據的描述信息 header_json = header_bytes.decode('utf-8') header_dic = json.loads(header_json) ''' header_dic = { 'filename': filename, # 1.txt 'file_size': os.path.getsize(r'%s/%s' % (share_dir, filename)) # 路徑/1.txt } ''' total_size = header_dic['file_size'] file_name = header_dic['filename'] # 第四步:接收真實的數據 with open(r'%s/%s'%(download_dir, file_name),'wb') as f: recv_size = 0 while recv_size < total_size: line = gd_client.recv(1024) f.write(line) recv_size += len(line) print('總大?。?s 已下載大?。?s' % (total_size, recv_size))gd_client.close()
server:
#!/usr/bin/env python# -*-coding:utf-8 -*-import socketimport subprocessimport structimport jsonimport osshare_dir = r'D:/Python/python_learning/gd/code/part3/02網絡編程/文件傳輸/server/share'gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)gd_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)gd_server.bind(('127.0.0.1', 8123)) # 0-65535: 0-1024給操作系統使用gd_server.listen(5)while True: conn, client_addr = gd_server.accept() while True: # 通信循環 try: # 1、收命令 res = conn.recv(8096) # b'get 1.txt' if not res: break # 適用于linux操作系統 # 2、解析命令,提取相應命令參數 cmds = res.decode('utf-8').split() # ['get','1.txt'] filename = cmds[1] # 3、以讀的方式打開文件,讀取文件內容發送給客戶端 # 第一步:制作固定長度的報頭 header_dic = { 'filename': filename, # 1.txt 'file_size':os.path.getsize(r'%s/%s'%(share_dir, filename)) # 路徑/1.txt } header_json = json.dumps(header_dic) header_bytes = header_json.encode('utf-8') # 第二步:先發送報頭的長度 conn.send(struct.pack('i',len(header_bytes))) # 第三步:再發報頭 conn.send(header_bytes) # 第四步:再發送真實的數據 with open('%s/%s'%(share_dir, filename),'rb') as f: for line in f: conn.send(line) except ConnectionResetError: # 適用于windows操作系統 break conn.close()gd_server.close()
新聞熱點
疑難解答