多重化セレクタを使用してIOモジュールは、アップロードとダウンロード機能を書きます

インポートセレクタは
ソケットインポート
インポート構造体
インポートJSON 
インポートOS、SYS 
BASEDIR = os.path.dirname(__ FILE__)

クラスサーバー:
    DEF __init __(自己):
        self.dic = {} 
        self.sel = selectors.DefaultSelector()
        self.makesock( )
        self.handle()

    DEF makesock(自己):
        靴下= socket.socket()
        sock.bind(( '127.0.0.1'、8099))
        sock.listen(5) 偽)sock.setblocking 
        self.sel.registerを(靴下、selectors.EVENT_READ、self.accept)

    デフ(自己)を扱う:
        真の間、: 
            イベント= self.sel.select()
            キーのため、イベントでマスク: 
                FUNC = key.data 
                FUNC(key.fileobj、マスク)

    DEF受け入れる(自己、靴下、マスク):
        CONN、ADDR = sock.accept()
        self.sel.register(CONN、selectors.EVENT_READ 、self.read)
        self.dic [CONN] = {} 

    DEF読み出す(自己、CONN、マスク):
        いない場合self.dic [CONN]:
            試す:
                長さ= struct.unpack( 'i'は、conn.recv(4 ))[0] 
                CMD = json.loads(conn.recv(長さ).decode( 'UTF8'))
            の例外を除き、Eとして:
                プリント(E)
                はconn.close()
                self.sel.unregister(CONN)
                リターン
            もしCMD [ '行動'] == '置く': 
                    #プリント(ファイルサイズ)
                    ファイルサイズ場合:
                        F =オープン(パス、 'RB')
 
                conn.send(B'0' )
                F =オープン(os.path.basename(CMD [ 'ファイル名'])、 'WB')
                でない場合、CMD [ 'ファイルサイズ']:
                    f.close()
                    戻り
                self.dic [CONN]を= CMD 
                self.dic [CONN ] [ 'DATA_LEN'] = 0 
                self.dic [CONN] [ 'ファイル'] = Fの
            ELIFのCMD [ '作用'] == '入手':
                パス= os.path.joinを(BASEDIR、CMD [ 'ファイル名'] )
                場合os.path.exists(パス)とos.path.isfile(パス):
                    ファイルサイズ= os.path.getsize(パス) 
                        self.dic [CONN] [ 'ファイル'] = Fの
                        conn.send(B'2' )
                        self.dic [CONN] = CMD 
                        conn.send(STR(ファイルサイズ).encode( 'UTF8'))
                    他:
                        conn.send(B'1 ')
                他:
                    conn.send(B'0')
        他:
            はhasattrもし(自己、self.dic [CONN] [ '作用']):
                FUNC = GETATTR(自己、self.dic [CONN] [ '作用'])
                FUNC(CONN)

    DEF得る(自己、CONN):

        データ=自己。 DIC [CONN] [ 'ファイル']読み取る(1024)。
        そうでない場合のデータ:
            。self.dic [CONN] [ 'ファイル']クローズ()
            self.dic [CONN] = {} 
            戻り
        ステータス= conn.recv(1 )
        conn.send(データ)

    デフ(自己、CONN)入れ:
        もしself.dic [CONN] [ 'DATA_LEN'] == self.dic [CONN] [ 'ファイルサイズ']:
            self.dic [CONN] [ 'ファイル']クローズ()。
            self.dic [CONN] = {} 
            戻り
        データ= conn.recv(1024)
        self.dic [CONN] [ 'ファイル'](データ)を書き込む。
        self.dic [CONN] [ 'DATA_LEN'] + = LEN(データ)

__name__ == '__main__'の場合:
    サーバ()
輸入ソケット
輸入構造体
のインポートのJSON 
輸入OS、SYS 

クラスのクライアント:
    デフ__init __(自己、ip_port):
        self.ip_port = ip_port 
        self.makeconn()
        self.handle()

    デフmakeconn(自己):
        self.conn = socket.socket( )
        self.conn.connect(self.ip_port)

    DEF自己(ハンドル):
        一方TRUE:
            CMD =入力( ">>>")
            CMD = cmd.split()
            はhasattr(セルフは、[0])cmdを場合:
                FUNCを= GETATTR(自己、CMD [0])
                FUNC(* CMD)

    DEF jindu(自己、サイズ、ファイルサイズ): 
        baifen_len =サイズ/ファイルサイズ
        baifen = INT(baifen_len * 100) 
        ISOK = 0 
        であればbaifen == 100:
            R = '\ R%S>%D %% \ n' %( '=' * baifen、baifen)
            ISOK = 1 
        さもなければ:
            R = "\ rを%S>%D %%" %( '=' * baifen、baifenは、)
        sys.stdout.write(r)は
        sys.stdout.flush 
        ISOK返す

    :GET(自己、* CMD)DEF 
        データ= { 
            "アクション」: "GET"、
            "ファイル名":[1] cmdを
        } 
        データ= json.dumps(データ).encode( 'UTF8')
        長さ= struct.pack( 'I'、LEN(データ))
        self.connを。 (長さ)を送信
        self.connを。データを送る)
        ステータス= self.conn.recv(1).decode( 'UTF-8') 
        データ= {) 
        ==ステータスIF '0':
            印刷( "ファイルが存在しません")
            リターン
        F =オープン(os.path.basename(CMD [1])、 'WB')
        状態であれば== '1':
            f.close()
            戻り
        ファイルサイズ= self.conn.recv(1024).decode( 'UTF8 ')
        ファイルサイズ= INT(ファイルサイズ)
        file_len = 0 
        しばらく真:
            self.conn.send(B'0')
            file_data = self.conn.recv(1024)
            file_len + = LEN(file_data)
            f.write(file_data)
            自己あれば.jindu(file_len、ファイルサイズ):
                f.close()
                ブレイク

    (自己、* CMD)入れDEF:
            "アクション": "置く"、
            "ファイル名":CMD [1] 
        } 
        os.path.exists(CMD [1])とos.path.isfile(CMD [1])の場合:
            ファイルサイズ= os.path.getsize (CMD [1])
            のデータ[ 'ファイルサイズ'] =ファイルサイズ
            データ= json.dumps(データ).encode( 'UTF8')
            長さ= struct.pack( 'I'、LEN(データ))
            self.conn.send(長さ)
            self.conn.send(データ)
            ステータス= self.conn.recv(1)
            DATA_LEN = 0 
            開く(FとしてCMD [1]、 'RB') 真ながら
                    データ= f.read(1024)
                    ならないデータ:リターン
                    self.conn.send(データ)
                    DATA_LEN + = LEN(データ)
                    場合self.jindu(DATA_LEN、ファイルサイズ):
                        破る
        他:
            プリント( "文件不存在")
            返す



場合__name__ == '__main__':
    C =クライアント(( '127.0.0.1'、8099))
    c.handle()

 

おすすめ

転載: www.cnblogs.com/xieys-1993/p/11724170.html