[terry筆記]python FTP

来源:http://www.cnblogs.com/kkterry/archive/2016/12/03/6127987.html
-Advertisement-
Play Games

如下是作業,用python做一個ftp,主要利用socket。 server端在linux下運行,在client端可以執行shell命令(靜態的) 在client端輸入get xxx,即可下載。 在client端輸入put xxx,即可上傳。 server端: client端: ...


如下是作業,用python做一個ftp,主要利用socket。

server端在linux下運行,在client端可以執行shell命令(靜態的)

在client端輸入get xxx,即可下載。

在client端輸入put xxx,即可上傳。

 

server端:

 1 import socket
 2 import subprocess
 3 import os
 4 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 5 server.bind(("0.0.0.0",8000))
 6 server.listen(5)
 7 print("start to listen".center(30,"-"))
 8 
 9 while True:
10     conn,client_addr = server.accept()
11     print(conn,client_addr)
12     while True:
13         try:
14             data = conn.recv(1024)
15             print("receive from client :",data)
16             if (data.decode()).startswith("get"):
17                 data_cmd = data.decode()
18                 data_cmd_list = data_cmd.split(" ")
19                 file_name = data_cmd_list[-1]
20                 conn.send(str(os.path.getsize(file_name)).encode())
21                 f = open(file_name,"rb")
22                 f_data = f.readlines()
23                 for line in f_data:
24                     conn.send(line)
25             elif (data.decode()).startswith("put"):
26                 data_size = conn.recv(1024)
27                 if data_size.decode() == "no file":
28                     continue
29                 print("The file's size is %sM" % round(int(data_size.decode()) / 1024 / 1024, 2))
30                 data_list = (data.decode()).split(" ")
31                 file_name = data_list[-1]
32                 f = open(file_name, "wb")
33                 total_size = int(data_size.decode())
34                 file_size = 0
35                 while True:
36                     data2 = conn.recv(1024)
37                     f.write(data2)
38                     file_size += len(data2)
39                     if file_size == total_size:
40                         break
41                 f.close()
42                 print("file upload done")
43             else:
44                 res_obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
45                 res = res_obj.stdout.read()
46                 conn.send(str(len(res)).encode())
47                 print("--res len :",len(res))
48                 conn.send(res)
49         except ConnectionResetError as e:
50             print(client_addr,"is break")
51             break
52         except FileNotFoundError as e:
53             print("there is no such file!")
54             conn.send(b"no file")
55             continue

 

client端:

 1 import socket
 2 import os
 3 client = socket.socket()
 4 client.connect(("192.168.168.128",8000))
 5 # client.connect(("localhost",8000))
 6 
 7 while True:
 8     try:
 9         msg = input(">>>>>").strip()
10         if len(msg) == 0: continue
11         client.send(msg.encode())
12         if msg.startswith("get"):
13             data = client.recv(1024)
14             if data.decode() == "no file":
15                 print("there is no such file!")
16                 continue
17             else:
18                 print("The file's size is %sM" % round(int(data.decode())/1024/1024,2))
19                 msg_list = msg.split(" ")
20                 file_name = msg_list[-1]
21                 f = open(file_name,"wb")
22                 total_size = int(data.decode())
23                 file_size = 0
24                 while True:
25                     data2 = client.recv(1024)
26                     f.write(data2)
27                     file_size += len(data2)
28                     if file_size == total_size:
29                         break
30                 f.close()
31         elif msg.startswith("put"):
32             msg_cmd_list = msg.split(" ")
33             file_name = msg_cmd_list[-1]
34             client.send(str(os.path.getsize(file_name)).encode())
35             f = open(file_name, "rb")
36             f_data = f.readlines()
37             for line in f_data:
38                 client.send(line)
39         else:
40             data = client.recv(1024)
41             print("client receive:", data.decode())
42             total_size = int(data.decode())
43             received_size = 0
44             res = b""
45             while received_size < total_size:
46                 d = client.recv(1024)
47                 res += d
48                 received_size += len(d)
49             print("-----receive done-----")
50             print(res.decode())
51     except FileNotFoundError as e:
52         print("There is no such file!")
53         client.send(b"no file")
54         continue

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ORM 眾所周知有很多不同的資料庫系統,並且其中的大部分系統都包含Python介面,能夠讓我們更好的利用它們的功能,而這些系統唯一的缺點就是需要你瞭解SQL,如果你是一個更願意操縱Python對象,而不是SQL查詢的程式員,並且仍然希望使用關係資料庫作為你的數據後端,那麼我們可以使用ORM。 這些O ...
  • 1、流程分析: 1. 請求發送給 StrutsPrepareAndExecuteFilter 2. StrutsPrepareAndExecuteFilter 詢問 ActionMapper: 該請求是否是一個 Struts2 請求(即是否返回一個非空的 ActionMapping 對象) 3. 若 ...
  • 冪等概念來自數學,表示N次變換和1次變換的結果是相同的。這裡討論在某些場景下,客戶端在調用服務沒有達到預期結果時,會進行多次調用,為避免多次重覆的調用對服務資源產生副作用,服務提供者會承諾滿足冪等。 ...
  • map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。 例如,對於list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每個元素都作平方,就可以用map( ...
  • 前邊我們說過了 Http協議 有兩個缺陷 一個是無狀態 、 一個是純文本 。 純文本也就是說Http請求中的內容都是以字元串的形式發送的。 但是Java又是一個強類型語言,所以將一個字元串轉換成Java中的數據類型這一重任就落在了Struts2的肩膀上。 類型轉換最常見的可能就是將將10/29/20 ...
  • 系統環境 ubuntu 14.04 LTS vsftpd安裝 配置文件 預設配置文件的位置為 /etc/vsftpd.conf 常見問題 500 OOPS: vsftpd: refusing to run with writable root inside chroot 解:所設置的目錄不能有寫許可權 ...
  • 2016-12-03 數組定義字元串: 每次定義數組的時候,系統都會在記憶體開闢你指定數組大小的空間,並且數組中的內容對於我們是可讀可寫的,看如下代碼: 1 #include<stdio.h> 2 int main() 3 { 4 char str[100] = "hello world"; 5 ch ...
  • 原文:http://www.cnblogs.com/imaker/p/6128049.html 所屬年份:2010.9;2012.3編寫函數fun,其功能是:根據以下公式求π的值(要求精度0.0005,即某項小於0.0005時停止迭代)。 程式運行後,若輸入精度0.0005,則程式應輸出為3.14… ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...