インポートセレクタは
ソケットインポート
インポート構造体
インポート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()