自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)通信Socket模塊實(shí)現(xiàn)文件傳輸

網(wǎng)絡(luò) 通信技術(shù)
本篇給大家介紹網(wǎng)絡(luò)通信Socket模塊實(shí)現(xiàn)文件傳輸

 實(shí)現(xiàn)的效果如下的Gif所示,就是網(wǎng)絡(luò)通信Socket模塊實(shí)現(xiàn)文件下載傳輸。

服務(wù)端

首先需要獲取本機(jī)ip,這里服務(wù)端采用多線程的方法,就是定義一個(gè)函數(shù),然后用threading創(chuàng)建任務(wù)??蛻?hù)端連接成功,接收客戶(hù)端的請(qǐng)求信息,就是下載的文件名。所以需要判斷,有輸出文件字節(jié)數(shù)。然后在問(wèn)用戶(hù)是不是要下載,得到信息就使用 while True: 讀文件的內(nèi)容,再一個(gè)send。看代碼是不是就是這么回事。

  1. import socket 
  2. import os 
  3. import threading 
  4.  
  5. # 獲取本機(jī)ip 
  6. def get_host_ip(): 
  7.     try: 
  8.         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
  9.         s.connect(('8.8.8.8', 80)) 
  10.         ip = s.getsockname()[0] 
  11.     finally: 
  12.         s.close() 
  13.  
  14.     return ip 
  15.  
  16. # 處理客戶(hù)端請(qǐng)求下載文件的操作(從主線程提出來(lái)的代碼) 
  17. def deal_client_request(ip_port, service_client_socket): 
  18.     # 連接成功后,輸出“客戶(hù)端連接成功”和客戶(hù)端的ip和端口 
  19.     print("客戶(hù)端連接成功", ip_port) 
  20.     # 接收客戶(hù)端的請(qǐng)求信息【recv】 
  21.     file_name = service_client_socket.recv(1024) 
  22.     # 解碼 
  23.     file_name_data = file_name.decode("utf-8"
  24.     # 判斷文件是否存在 
  25.     if os.path.exists(file_name_data): 
  26.         #輸出文件字節(jié)數(shù) 
  27.         fsize = os.path.getsize(file_name_data) 
  28.         #轉(zhuǎn)化為兆單位 
  29.         fmb = fsize/float(1024*1024) 
  30.         #要傳輸?shù)奈募畔?nbsp;
  31.         senddata = "文件名:%s  文件大?。?.2fMB"%(file_name_data,fmb) 
  32.         #發(fā)送和打印文件信息【send】 
  33.         service_client_socket.send(senddata.encode("utf-8")) 
  34.         print("請(qǐng)求文件名:%s  文件大?。?.2f MB"%(file_name_data,fmb)) 
  35.         #接受客戶(hù)是否需要下載【recv】 
  36.         options = service_client_socket.recv(1024) 
  37.         if options.decode("utf-8") == "y"
  38.             # 打開(kāi)文件 
  39.             with open(file_name_data, "rb"as f: 
  40.                 # 計(jì)算總數(shù)據(jù)包數(shù)目 
  41.                 nums = fsize/1024 
  42.                 # 當(dāng)前傳輸?shù)臄?shù)據(jù)包數(shù)目 
  43.                 cnum = 0 
  44.  
  45.                 while True
  46.                     file_data = f.read(1024) 
  47.                     cnum = cnum + 1 
  48.                     #progress = cnum/nums*100 
  49.  
  50.                     #print("當(dāng)前已下載:%.2f%%"%progress,end = "\r"
  51.                     if file_data: 
  52.                         # 只要讀取到數(shù)據(jù),就向客戶(hù)端進(jìn)行發(fā)送【send】 
  53.                         service_client_socket.send(file_data) 
  54.                     # 數(shù)據(jù)讀完,退出循環(huán) 
  55.                     else
  56.                         print("請(qǐng)求的文件數(shù)據(jù)發(fā)送完成"
  57.                         break 
  58.         else
  59.             print("下載取消!"
  60.     else
  61.         print("下載的文件不存在!"
  62.     # 關(guān)閉服務(wù)當(dāng)前客戶(hù)端的套接字【close】 
  63.     service_client_socket.close() 
  64.  
  65.  
  66. if __name__ == '__main__'
  67.     # 獲取本機(jī)ip 
  68.     print("TCP文件傳輸服務(wù)器,本機(jī)IP:" + get_host_ip()) 
  69.      
  70.     # 把工作目錄切換到data目錄下 
  71.     os.chdir("./data"
  72.     # 創(chuàng)建套接字【socket】 
  73.     tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  74.     # 綁定端口號(hào)【bind】 
  75.     tcp_server_socket.bind(("", 3356)) 
  76.     # 設(shè)置監(jiān)聽(tīng),將主動(dòng)套接字變?yōu)楸粍?dòng)套接字【listen】 
  77.     tcp_server_socket.listen(128) 
  78.  
  79.     # 循環(huán)調(diào)用【accept】,可以支持多個(gè)客戶(hù)端同時(shí)連接,和多個(gè)客戶(hù)端同時(shí)下載文件 
  80.     while True
  81.         service_client_socket, ip_port = tcp_server_socket.accept() 
  82.         # 連接成功后打印套接字號(hào) 
  83.         #print(id(service_client_socket)) 
  84.  
  85.         # 創(chuàng)建子線程 
  86.         sub_thread = threading.Thread(target=deal_client_request, args=(ip_port, service_client_socket)) 
  87.         # 啟動(dòng)子線程 
  88.         sub_thread.start() 

客戶(hù)端

客戶(hù)端更簡(jiǎn)單,連接服務(wù)端,發(fā)送下載文件的請(qǐng)求,定義一個(gè)寫(xiě)入的文件夾,就是小兒科東西。不寫(xiě)了,看代碼。

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

擴(kuò)展

如果手機(jī)想要下載電腦上的文件(電腦和手機(jī)之間),需要確保電腦和手機(jī)連接的網(wǎng)絡(luò)在同一個(gè)路由器下

通過(guò)ipconfig查看ip

命令行輸入python -m http.server 8888來(lái)搭建局域網(wǎng)

手機(jī)訪問(wèn)192.168.0.101:8888即可下載文件

本文已收錄 GitHub,傳送門(mén)~[1] ,里面更有大廠面試完整考點(diǎn),歡迎 Star。

Reference

[1]傳送門(mén)~:

 

https://github.com/MaoliRUNsen/runsenlearnpy100

 

責(zé)任編輯:姜華 來(lái)源: Python之王
相關(guān)推薦

2012-03-19 10:35:51

ibmdw

2017-01-15 17:44:56

node網(wǎng)絡(luò)通信Socket

2009-10-27 16:52:41

VB.NET文件傳輸

2019-10-22 08:11:43

Socket網(wǎng)絡(luò)通信網(wǎng)絡(luò)協(xié)議

2024-04-23 13:36:00

2009-09-07 13:38:03

C# HTTP文件傳輸HTTP文件傳輸

2011-08-24 10:18:56

2009-01-18 09:28:00

2023-11-04 09:06:11

2019-08-30 13:25:09

WinSCPWindowsLinux

2010-06-28 14:25:16

2010-07-01 15:55:54

FTP文件傳輸協(xié)議

2017-02-27 20:24:27

Linux文件傳輸命令

2011-03-25 14:20:44

263郵箱超大附件

2009-08-26 14:35:00

用C#實(shí)現(xiàn)HTTP協(xié)議

2020-11-12 08:52:16

Python

2019-04-29 10:26:49

TCP網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)通信

2009-08-24 17:20:13

C#網(wǎng)絡(luò)通信TCP連接

2022-12-05 09:25:17

Kubernetes網(wǎng)絡(luò)模型網(wǎng)絡(luò)通信

2024-02-20 19:53:57

網(wǎng)絡(luò)通信協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)