成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網絡通信Socket模塊實現文件傳輸

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

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

服務端

首先需要獲取本機ip,這里服務端采用多線程的方法,就是定義一個函數,然后用threading創建任務??蛻舳诉B接成功,接收客戶端的請求信息,就是下載的文件名。所以需要判斷,有輸出文件字節數。然后在問用戶是不是要下載,得到信息就使用 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.         #輸出文件字節數 
  27.         fsize = os.path.getsize(file_name_data) 
  28.         #轉化為兆單位 
  29.         fmb = fsize/float(1024*1024) 
  30.         #要傳輸的文件信息 
  31.         senddata = "文件名:%s  文件大小:%.2fMB"%(file_name_data,fmb) 
  32.         #發送和打印文件信息【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.                 # 計算總數據包數目 
  41.                 nums = fsize/1024 
  42.                 # 當前傳輸的數據包數目 
  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.                         # 只要讀取到數據,就向客戶端進行發送【send】 
  53.                         service_client_socket.send(file_data) 
  54.                     # 數據讀完,退出循環 
  55.                     else
  56.                         print("請求的文件數據發送完成"
  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.     # 創建套接字【socket】 
  73.     tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  74.     # 綁定端口號【bind】 
  75.     tcp_server_socket.bind(("", 3356)) 
  76.     # 設置監聽,將主動套接字變為被動套接字【listen】 
  77.     tcp_server_socket.listen(128) 
  78.  
  79.     # 循環調用【accept】,可以支持多個客戶端同時連接,和多個客戶端同時下載文件 
  80.     while True
  81.         service_client_socket, ip_port = tcp_server_socket.accept() 
  82.         # 連接成功后打印套接字號 
  83.         #print(id(service_client_socket)) 
  84.  
  85.         # 創建子線程 
  86.         sub_thread = threading.Thread(target=deal_client_request, args=(ip_port, service_client_socket)) 
  87.         # 啟動子線程 
  88.         sub_thread.start() 

客戶端

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

  1. # -*- coding:utf-8 -*- 
  2. # 多任務文件下載器客戶端 
  3. import socket 
  4. import os 
  5.  
  6. if __name__ == '__main__'
  7.     # 創建套接字【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.     # 發送下載文件的請求 
  13.     file_name = input("請輸入要下載的文件名:"
  14.     # 編碼 
  15.     file_name_data = file_name.encode("utf-8"
  16.     # 發送文件下載請求數據【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.         # 把數據寫入到文件里 
  40.         with open(recvpath + file_name, "wb"as file: 
  41.             #目前接收到的數據包數目 
  42.             cnum = 0 
  43.  
  44.             while True
  45.                 # 循環接收文件數據【recv】 
  46.                 file_data = tcp_client_socket.recv(1024) 
  47.                 # 接收到數據 
  48.                 if file_data: 
  49.                     # 寫入數據 
  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

2019-10-22 08:11:43

Socket網絡通信網絡協議

2024-04-23 13:36:00

2009-10-27 16:52:41

VB.NET文件傳輸

2009-09-07 13:38:03

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

2009-01-18 09:28:00

2011-08-24 10:18:56

2023-11-04 09:06:11

2011-03-25 14:20:44

263郵箱超大附件

2009-08-24 17:20:13

C#網絡通信TCP連接

2020-11-12 08:52:16

Python

2019-04-29 10:26:49

TCP網絡協議網絡通信

2010-07-01 15:55:54

FTP文件傳輸協議

2017-02-27 20:24:27

Linux文件傳輸命令

2010-06-28 14:25:16

2022-12-05 09:25:17

Kubernetes網絡模型網絡通信

2009-08-26 14:35:00

用C#實現HTTP協議

2019-08-30 13:25:09

WinSCPWindowsLinux

2024-02-20 19:53:57

網絡通信協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 孕妇一级毛片 | 免费的色网站 | 亚洲精品一二三区 | 精品伊人 | 久久国产精品免费一区二区三区 | 三级成人片 | 欧美精品99 | 在线视频 欧美日韩 | 日韩在线播放第一页 | 成人影院在线观看 | av中文在线| 一级片在线视频 | 激情伊人网 | 黄网免费看 | 中文字幕一区二区三区不卡 | 又黄又色| 亚洲成人精品一区 | 一级片片 | 99精品国产一区二区三区 | www.久久影视 | 成人亚洲精品久久久久软件 | 国产精品日韩欧美一区二区 | 日韩欧美一区二区三区免费观看 | 午夜精品久久久久久久久久久久久 | 一区二区在线不卡 | 成人免费激情视频 | 欧美在线一区二区三区 | 国产99在线 | 欧美 | 欧美性影院 | 九色网址| 蜜桃av鲁一鲁一鲁一鲁 | 亚洲色在线视频 | 国产丝袜一区二区三区免费视频 | 蜜臀久久 | 精品国产一区二区三区久久久蜜月 | 久久久久久久一级 | 成人精品国产一区二区4080 | 麻豆一区二区三区精品视频 | 亚洲成人激情在线观看 | 一区二区三区免费观看 | 亚洲欧洲在线观看视频 |