偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

網絡通信Socket模塊實現(xiàn)文件傳輸

網絡 通信技術
本篇給大家介紹網絡通信Socket模塊實現(xiàn)文件傳輸

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

服務端

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

  1. import socket 
  2. import os 
  3. import threading 
  4.  
  5. # 獲取本機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. # 處理客戶端請求下載文件的操作(從主線程提出來的代碼) 
  17. def deal_client_request(ip_port, service_client_socket): 
  18.     # 連接成功后,輸出“客戶端連接成功”和客戶端的ip和端口 
  19.     print("客戶端連接成功", ip_port) 
  20.     # 接收客戶端的請求信息【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.         #轉化為兆單位 
  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("請求文件名:%s  文件大?。?.2f MB"%(file_name_data,fmb)) 
  35.         #接受客戶是否需要下載【recv】 
  36.         options = service_client_socket.recv(1024) 
  37.         if options.decode("utf-8") == "y"
  38.             # 打開文件 
  39.             with open(file_name_data, "rb"as f: 
  40.                 # 計算總數(shù)據(jù)包數(shù)目 
  41.                 nums = fsize/1024 
  42.                 # 當前傳輸?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("當前已下載:%.2f%%"%progress,end = "\r"
  51.                     if file_data: 
  52.                         # 只要讀取到數(shù)據(jù),就向客戶端進行發(fā)送【send】 
  53.                         service_client_socket.send(file_data) 
  54.                     # 數(shù)據(jù)讀完,退出循環(huán) 
  55.                     else
  56.                         print("請求的文件數(shù)據(jù)發(fā)送完成"
  57.                         break 
  58.         else
  59.             print("下載取消!"
  60.     else
  61.         print("下載的文件不存在!"
  62.     # 關閉服務當前客戶端的套接字【close】 
  63.     service_client_socket.close() 
  64.  
  65.  
  66. if __name__ == '__main__'
  67.     # 獲取本機ip 
  68.     print("TCP文件傳輸服務器,本機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.     # 綁定端口號【bind】 
  75.     tcp_server_socket.bind(("", 3356)) 
  76.     # 設置監(jiān)聽,將主動套接字變?yōu)楸粍犹捉幼帧緇isten】 
  77.     tcp_server_socket.listen(128) 
  78.  
  79.     # 循環(huán)調用【accept】,可以支持多個客戶端同時連接,和多個客戶端同時下載文件 
  80.     while True
  81.         service_client_socket, ip_port = tcp_server_socket.accept() 
  82.         # 連接成功后打印套接字號 
  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.         # 啟動子線程 
  88.         sub_thread.start() 

客戶端

客戶端更簡單,連接服務端,發(fā)送下載文件的請求,定義一個寫入的文件夾,就是小兒科東西。不寫了,看代碼。

  1. # -*- coding:utf-8 -*- 
  2. # 多任務文件下載器客戶端 
  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.     # 和服務端連接【connect】 
  10.     server_ip = input("輸入服務器IP:"
  11.     tcp_client_socket.connect((server_ip, 3356)) 
  12.     # 發(fā)送下載文件的請求 
  13.     file_name = input("請輸入要下載的文件名:"
  14.     # 編碼 
  15.     file_name_data = file_name.encode("utf-8"
  16.     # 發(fā)送文件下載請求數(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 確認 輸入q 取消 
  27.     opts = input("是否下載?(y 確認 q 取消)"
  28.     if opts == 'q'
  29.         print("下載取消!程序退出"
  30.     else
  31.         print("正在下載 >>>>>>"
  32.         #向服務器確認正在下載【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ù)寫入到文件里 
  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.                     # 寫入數(shù)據(jù) 
  50.                     file.write(file_data) 
  51.                     cnum = cnum+1 
  52.                     #progress =cnum/fileszie2*100 
  53.                     #print("當前已下載:%.2f%%"%progress,end = "\r"
  54.                 # 接收完成 
  55.                 else
  56.                     print("下載結束!"
  57.                     break 
  58.     # 關閉套接字【close】 
  59.     tcp_client_socket.close() 

擴展

如果手機想要下載電腦上的文件(電腦和手機之間),需要確保電腦和手機連接的網絡在同一個路由器下

通過ipconfig查看ip

命令行輸入python -m http.server 8888來搭建局域網

手機訪問192.168.0.101:8888即可下載文件

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

Reference

[1]傳送門~:

 

https://github.com/MaoliRUNsen/runsenlearnpy100

 

責任編輯:姜華 來源: Python之王
相關推薦

2012-03-19 10:35:51

ibmdw

2017-01-15 17:44:56

node網絡通信Socket

2024-04-23 13:36:00

2009-10-27 16:52:41

VB.NET文件傳輸

2019-10-22 08:11:43

Socket網絡通信網絡協(xié)議

2009-09-07 13:38:03

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

2009-01-18 09:28:00

2023-11-04 09:06:11

2011-08-24 10:18:56

2009-08-24 17:20:13

C#網絡通信TCP連接

2020-11-12 08:52:16

Python

2019-04-29 10:26:49

TCP網絡協(xié)議網絡通信

2011-03-25 14:20:44

263郵箱超大附件

2010-07-01 15:55:54

FTP文件傳輸協(xié)議

2017-02-27 20:24:27

Linux文件傳輸命令

2010-06-28 14:25:16

2019-08-30 13:25:09

WinSCPWindowsLinux

2009-08-26 14:35:00

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

2022-12-05 09:25:17

Kubernetes網絡模型網絡通信

2024-02-20 19:53:57

網絡通信協(xié)議
點贊
收藏

51CTO技術棧公眾號