Python07新版作業源碼:開發簡單的FTP(僅供參考)

来源:http://www.cnblogs.com/chensiqiqi/archive/2016/12/12/6165664.html
-Advertisement-
Play Games

伺服器端:server_server.py 伺服器端:user_users.py 客戶端:server_client.py ...


  • 伺服器端:server_server.py
 1 #!usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # auther:Mr.chen
 4 # 描述:
 5 
 6 import socket
 7 import os
 8 import threading
 9 import time
10 import json
11 from user_users import PersonInfo
12 
13 DIR = os.path.dirname(os.path.abspath(__file__))
14 DIR = DIR+'/Folder/'
15 
16 TAG = True
17 
18 
19 
20 def tcplink(conn,addr):
21     """
22     tcp請求分析函數
23     :param conn: tcp連接對象
24     :param addr: 連接地址
25     :return:
26     """
27     print ("收到來自{0}的連接請求".format(addr))
28     conn.send('與主機通信中...')
29     while TAG:
30         try:
31             data = conn.recv(4096)
32             time.sleep(1)
33             if not data:
34                 break
35             else:
36                 print (data)
37                 if data == 'ls':
38                     P.view_file(conn)
39                     continue
40                 action,filename = data.strip().split()
41                 action = action.lower()
42                 if action == 'put':
43                     re = P.Recvfile(conn,filename)
44                     if re == True:
45                         print ("文件接收成功!")
46                     else:
47                         print ("文件接收失敗!")
48                 elif action == 'get':
49 
50                     P.Sendfile(conn,filename)
51                 elif action == 'login':
52                     name, password = filename.split(',')
53                     P = PersonInfo(name, password)
54                     re = P.login()
55                     if re == True:
56                         conn.send('Ready!')
57                     else:
58                         conn.send('False!')
59                 elif action == 'register':
60                     name,password = filename.split(',')
61                     P = PersonInfo(name, password)
62                     re = P.register()
63                     if re == True:
64                         conn.send('Ready!')
65                     else:
66                         conn.send('False!')
67                 else:
68                     print ("請求方的輸入有錯!")
69                     continue
70         except Exception,e:
71             print "tcplink處理出現問題",e
72             break
73 
74 
75 
76 
77 if __name__ == '__main__':
78     host = 'localhost'
79     port = 8888
80     s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
81     s.bind((host,port))
82     s.listen(5)
83     print ("服務運行中:正在監聽{0}地址的{1}埠:".format(host,port))
84     while TAG:
85         # 接受一個新連接
86         conn,addr = s.accept()
87         # 創建一個新線程處理TCP連接
88         t = threading.Thread(target=tcplink,args=(conn,addr))
89         t.start()

 

  • 伺服器端:user_users.py
  1 #!usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 # auther:Mr.chen
  4 # 描述:
  5 
  6 import time
  7 import os
  8 import pickle
  9 
 10 
 11 class PersonInfo:
 12     """
 13     用戶模型類
 14     """
 15     DIR = os.path.dirname(os.path.abspath(__file__))
 16     DIR = DIR + '/Folder/'
 17     ConfigDir = DIR.replace('Folder','db')
 18 
 19     def __init__(self,name,password):
 20         self.Name = name   #用戶名
 21         self.Password = password   #密碼
 22         self.DIR = PersonInfo.DIR + self.Name +'/'   #用戶家目錄
 23 
 24 
 25     def login(self):
 26         """
 27         用戶登陸
 28         :return:
 29         """
 30         dict = PersonInfo.config_read()
 31         if dict == None:
 32             return False
 33         if self.Name in dict:
 34             if dict[self.Name] == self.Password:
 35                 return True
 36         return False
 37 
 38 
 39 
 40     def register(self):
 41         """
 42         用戶註冊
 43         :return:
 44         """
 45         if os.path.exists(self.DIR) != True:
 46             os.system('mkdir'+' '+  self.DIR)
 47         try:
 48             dict = PersonInfo.config_read()
 49             if dict == None:
 50                 dict = {}
 51             if self.Name not in dict:
 52                 dict[self.Name] = self.Password
 53             else:
 54                 print ("姓名重覆")
 55                 return False
 56             re = PersonInfo.config_write(dict)
 57             if re == True:
 58                 return True
 59         except Exception,e:
 60             print "註冊出現異常!",e
 61             return False
 62 
 63 
 64 
 65     def view_file(self,conn):
 66         """
 67         查看用戶家目錄
 68         :param conn:
 69         :return:
 70         """
 71         data = os.popen('ls'+' '+ self.DIR).read()
 72         conn.sendall(data)
 73 
 74     def Recvfile(self,conn,filename):
 75         """
 76         接收文件方法
 77         :param conn:tcp連接對象
 78         :param filename:目標文件名
 79         :return:
 80         """
 81         print ("開始接收文件...")
 82         conn.send('Ready!')
 83         buffer = []
 84         while True:
 85             d = conn.recv(4096)
 86             if d == 'exit':
 87                 break
 88             else:
 89                 buffer.append(d)
 90         data = ''.join(buffer)
 91         if data == '':
 92             return False
 93         print (data)
 94         print (filename)
 95         print (self.DIR)
 96         with open(self.DIR + filename, 'w') as f:
 97             f.write(data)
 98             return True
 99 
100 
101     def Sendfile(self,conn,filename):
102         """
103             放送文件方法
104             :param conn: tcp連接對象
105             :param filename: 目標文件名
106             :return:
107             """
108 
109         if os.path.exists(self.DIR + filename):
110             print ("開始放送文件...")
111             conn.send('Ready!')
112             time.sleep(1)
113             with open(self.DIR + filename, 'r') as f:
114                 while True:
115                     data = f.read(4096)
116                     print (data)
117                     if not data:
118                         break
119                     conn.sendall(data)
120             time.sleep(1)
121             conn.send('exit')
122             print ("文件放送成功!")
123         else:
124             conn.send('False!')
125 
126 
127     @staticmethod
128     def config_read():
129         """
130         配置文件全部讀取
131         :return:
132         """
133         if os.path.exists(PersonInfo.ConfigDir+'user_config'):
134             with open(PersonInfo.ConfigDir+'user_config','r') as f:
135                 dict = pickle.load(f)
136                 return dict
137 
138 
139     @staticmethod
140     def config_write(dict):
141         """
142         配置文件全部寫入
143         :param dict:
144         :return:
145         """
146         with open(PersonInfo.ConfigDir + 'user_config', 'w') as f:
147             pickle.dump(dict,f)
148             return True

 

  • 客戶端:server_client.py

 

#!usr/bin/env python
# -*- coding:utf-8 -*-
# auther:Mr.chen
# 描述:

import socket,os
import time
TAG =True

DIR = os.path.dirname(os.path.abspath(__file__))
DIR = DIR+'/Folder/'
HOST = 'localhost'
PORT = 8888


def Recvfile(s,filename):
    """
    接收文件方法函數
    :param s: 套接字封裝對象
    :param filename: 目標文件名
    :return:
    """
    print ("開始下載文件...")
    buffer = []
    while TAG:
        d = s.recv(4096)
        if d == 'exit':
            break
        buffer.append(d)
    data = ''.join(buffer)
    with open(DIR+filename,'w') as f:
        f.write(data)
    print ("文件下載完畢!")


def Sendfile(s,filename):
    """
    放送文件方法函數
    :param s: 套接字封裝對象
    :param filename: 目標文件名
    :return:
    """
    print ("開始上傳文件!")
    if os.path.exists(DIR+filename):
        with open(DIR+filename,'r') as f:
            while TAG:
                data = f.read(4096)
                if not data:
                    break
                s.sendall(data)
        time.sleep(1)
        s.send('exit')
        print ("文件上傳完畢")
    else:
        print ("你的目錄里沒有這個文件")
        time.sleep(1)
        s.send('exit')




def Confirm(s,command):
    """
    驗證與伺服器連接是否正常;
    把用戶命令發過去,讓伺服器做好相應準備準備
    :param s: 套接字封裝對象
    :param command: 用戶輸入的命令
    :return:
    """
    s.sendall(command)
    re = s.recv(4096)
    if re == 'Ready!':
        return True
    elif re == 'False!':
        return False
    else:
        print ("與伺服器連接出現異常!")


def File_transfer(s):
    """
    用戶指令函數
    :param s:
    :return:
    """
    while TAG:
        command = raw_input("請輸入你想執行的命令>>")
        if not command:
            continue
        if command.lower().strip() == 'help':
            print ("請用'put'+'空格'+'文件名'的格式上傳文件")
            print ("請用'get'+'空格'+'文件名'的格式下載文件")
            print ("輸入'ls'查看用戶伺服器家目錄")
            continue
        if command.lower().strip() == 'ls':
            s.send('ls')
            data = s.recv(4096)
            print (data)
            continue
        try:
            action,filename = command.strip().split()
            action = action.lower()
        except:
            print ("您的輸入有誤!輸入help查看幫助文檔")
            continue
        if action == 'put':
            re = Confirm(s,command)
            if re == True:
                Sendfile(s, filename)
            else:
                print ("對方伺服器沒有準備好!")
                break
        elif action == 'get':
            re = Confirm(s,command)
            if re == True:
                Recvfile(s, filename)
            elif re == False:
                print ("伺服器家目錄沒有這個文件")
            else:
                print ("對方伺服器沒有準備好!")
                break
        else:
            print ("你輸入的命令有誤!輸入help查看幫助文檔")



def Login(s):
    """
    用戶登錄
    :param s:
    :return:
    """
    name = raw_input("請輸入你的用戶名:")
    password = raw_input("請輸入你的密碼:")
    command = 'login'+' '+ name + ',' + password
    re = Confirm(s, command)
    if re == True:
        print ("登陸成功!")
        File_transfer(s)
    elif re == False:
        print ("您的輸入有誤,請重新輸入!")
        Login(s)
    else:
        print ("與伺服器連接出現異常!")


def Register(s):
    """
    用戶註冊
    :param s:
    :return:
    """
    name = raw_input("請輸入你的用戶名:")
    password = raw_input("請輸入你的密碼:")
    Password = raw_input("請再次輸入密碼:")
    if password != Password:
        print ("你的密碼兩次輸入不一致,請重新輸入!")
        Register(s)
    command = 'register' + ' ' + name + ',' + password
    print (command)
    re = Confirm(s,command)
    if re == True:
        File_transfer(s)
    elif re == False:
        print ("用戶名重覆,請重新輸入!")
        Register(s)
    else:
        print ("與伺服器連接出現異常!")

def Main(s,log = '未聯通主機...'):
    """
    用戶登陸界面
    :param s:
    :param log:
    :return:
    """
    text = """
            用戶登陸界面      {0}

            1,用戶登陸
            2,用戶註冊
    """.format(log)
    print (text)
    choose = raw_input("請輸入索引進行選擇:")
    if choose == '1':
        Login(s)
    elif choose == '2':
        Register(s)
    else:
        print ("你的選擇有誤!")


if __name__ == "__main__":

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        s.connect((HOST,PORT))
        Main(s,s.recv(1024))
    except Exception,e:
        print "伺服器連接不上....",e
    finally:
        s.close()

 


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

-Advertisement-
Play Games
更多相關文章
  • 對於一個有登錄限制(許可權限制)的網站,用戶輸入身份驗證信息以後,驗證成功後跳轉到登錄前的頁面是一項很人性化的功能。那麼獲取登錄前的頁面地址就很關鍵,今天在做一個yii2項目的登錄調試時發現了一些很有意思的問題,記錄下來。 1,場景描述 網站SiteA上的頁面Page2需要登錄後才能查看,Page2的 ...
  • ...
  • 列印一排*,很簡單,列印下圖 也很簡單,代碼如下: 可是昨天想了好久都沒想到怎樣做到下麵圖片的樣子,今天突然就有了靈感 代碼很簡單,就是昨天想破了腦袋都想不出來,好笨啊我 第一行列印一個*,第二行行列印兩個*,大三行列印三個*,這樣分析就找到規律了,定義一個a=1,外層迴圈實現列印幾行,定義一個i= ...
  • 上面的代碼是段合法的cpp代碼嗎? 答案當然是是的. 這些 問號 是個什麼鬼?它們就是cpp標準中定義的 "Trigraph(MS)" .之所以出現這些神奇的符號,主因主要是字元集的問題.簡單來說可以理解為某些老外的鍵盤沒有"{","|","\"這些符號.所以需要用這種類似"轉義字元"的東東來表達c ...
  • KMP演算法是字元串模式匹配當中最經典的演算法,原來大二學數據結構的有講,但是當時只是記住了原理,但不知道代碼實現,今天終於是完成了KMP的代碼實現。原理KMP的原理其實很簡單,給定一個字元串和一個模式串,然後找模式串在給定字元串中的位置。將兩個字元串轉換為字元數組,然後從兩個數組的開始位置"i","j ...
  • Error Handling with Exceptions ___ The ideal time to catch an error is at compile time, before you even try to run the program. The rest of the proble ...
  • 今天跑程式的時候莫名其妙的出現了下麵的一個異常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforCangra.setSubDate([Ljava.lang.String;) 這類異常信息在以前是處理過的 ...
  • 本節我們介紹如何在Java中以二進位位元組的方式來處理文件,介紹主要的流,包括它們的功能、用法、原理和使用場景,最後,我們總結一些簡單的實用方法。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...