1. 程式人生 > >python實現tcp文件下載器

python實現tcp文件下載器

name eal 綁定 size 代碼 thread style 成功 退出

服務器端代碼

 1 import socket
 2 import os
 3 import threading
 4  
 5  
 6 # 處理客戶端請求下載文件的操作(從主線程提出來的代碼)
 7 def deal_client_request(ip_port, service_client_socket):
 8     # 連接成功後,輸出“客戶端連接成功”和客戶端的ip和端口
 9     print("客戶端連接成功", ip_port)
10     # 接收客戶端的請求信息
11     file_name = service_client_socket.recv(1024)
12 # 解碼 13 file_name_data = file_name.decode("utf-8") 14 # 判斷文件是否存在 15 if os.path.exists(file_name_data): 16 #輸出文件字節數 17 fsize = os.path.getsize(file_name_data) 18 #轉化為兆單位 19 fmb = fsize/float(1024*1024) 20 #要傳輸的文件信息 21 senddata = "
文件名:%s 文件大小:%.2fMB"%(file_name_data,fmb) 22 #發送和打印文件信息 23 service_client_socket.send(senddata.encode("utf-8")) 24 print("請求文件名:%s 文件大小:%.2f MB"%(file_name_data,fmb)) 25 #接受客戶是否需要下載 26 options = service_client_socket.recv(1024) 27 if options.decode("
utf-8") == "y": 28 # 打開文件 29 with open(file_name_data, "rb") as f: 30 # 計算總數據包數目 31 nums = fsize/1024 32 # 當前傳輸的數據包數目 33 cnum = 0 34 35 while True: 36 file_data = f.read(1024) 37 cnum = cnum + 1 38 jindu = cnum/nums*100 39 40 print("當前已下載:%.2f%%"%jindu,end = "\r") 41 if file_data: 42 # 只要讀取到數據,就向客戶端進行發送 43 service_client_socket.send(file_data) 44 # 數據讀完,退出循環 45 else: 46 print("請求的文件數據發送完成") 47 break 48 else: 49 print("下載取消!") 50 else: 51 print("下載的文件不存在!") 52 # 關閉服務當前客戶端的套接字 53 service_client_socket.close() 54 55 56 if __name__ == __main__: 57 # 把工作目錄切換到data目錄下 58 os.chdir("./data") 59 # 創建套接字 60 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 61 # 綁定端口號 62 tcp_server_socket.bind(("", 3356)) 63 # 設置監聽,將主動套接字變為被動套接字 64 tcp_server_socket.listen(128) 65 66 # 循環調用accept,可以支持多個客戶端同時連接,和多個客戶端同時下載文件 67 while True: 68 service_client_socket, ip_port = tcp_server_socket.accept() 69 # 連接成功後打印套接字號 70 #print(id(service_client_socket)) 71 72 # 創建子線程 73 sub_thread = threading.Thread(target=deal_client_request, args=(ip_port, service_client_socket)) 74 # 啟動子線程 75 sub_thread.start()

客戶端代碼

 1 # 多任務文件下載器客戶端
 2 import socket
 3  
 4  
 5 if __name__ == __main__:
 6     # 創建套接字
 7     tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 8     # 和服務端連接
 9     server_ip = input("輸入服務器IP:")
10     tcp_client_socket.connect((server_ip, 3356))
11     # 發送下載文件的請求
12     file_name = input("請輸入要下載的文件名:")
13     # 編碼
14     file_name_data = file_name.encode("utf-8")
15     # 發送文件下載請求數據
16     tcp_client_socket.send(file_name_data)
17     # 接收要下載的文件信息
18     file_info = tcp_client_socket.recv(1024)
19     # 文件信息解碼
20     info_decode = file_info.decode("utf-8")
21     print(info_decode)
22     #獲取文件大小
23     fileszie = float(info_decode.split()[2].split(MB)[0])
24     fileszie2 = fileszie*1024
25     # 是否下載?輸入y 確認 輸入q 取消
26     opts = input("是否下載?(y 確認 q 取消)")
27     if opts == q:
28         print("下載取消!程序退出")
29     else:
30         print("正在下載 》》》")
31         #向服務器確認正在下載
32         tcp_client_socket.send(by)
33 
34         # 把數據寫入到文件裏
35         with open("./" + file_name, "wb") as file:
36             #目前接收到的數據包數目
37             cnum = 0
38 
39             while True:
40                 # 循環接收文件數據
41                 file_data = tcp_client_socket.recv(1024)
42                 # 接收到數據
43                 if file_data:
44                     # 寫入數據
45                     file.write(file_data)
46                     cnum = cnum+1
47                     jindu =cnum/fileszie2*100
48                     print("當前已下載:%.2f%%"%jindu,end = "\r")
49                 # 接收完成
50                 else:
51                     print("下載結束!")
52                     break
53     # 關閉套接字
54     tcp_client_socket.close()

運行窗口

1)客戶端

技術分享圖片

2)服務器端

技術分享圖片

註意:客戶端和服務器端不要運行在idle中,直接終端運行

python實現tcp文件下載器