1 ############サーバ端 2 3 インポートセレクタ、ソケット、時間、ピクルス、OS、構造体 4 ip_port =(' 192.168.43.182 '、8080 ) 5 BUFFER_SIZE = 1024 6 back_log = 5 7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__FILE__ ))) 8つの 9 クラスSelectorsServer: 10 DEF __init__ (自己): 11 self.conn_dict = {} 12 self.has_put = 0 13 self.has_get =0 14 self.sel = selectors.DefaultSelector() # #创建セレクタ对象 15 self.creat_socket() 16 self.handle() # #监听 17 18 DEF creat_socket(自己): # #创建ソケット对象 19 靴下= socket.socket (socket.AF_INET、socket.SOCK_STREAM) 20 sock.bind(ip_port) 21 sock.listen(back_log) 22 sock.setblocking(False) 23 self.sel.register(sock、selectors.EVENT_READ、self.accept) 24 25 defハンドル(セルフ): # #イベントに耳を傾ける 26 しばらく:1 #1 #サイクルモニター 27の イベント= self.sel.select() 28の ためのキー、マスクに:イベント 29 コールバック= key.data 30 コールバック(key.fileobj、マスク) 31 32 33 def accept(self、sock、mask): ### Connection 34 conn、addr = sock.accept() 35 #print(conn) 36 print('The connection is successful ... ') 37 conn.setblocking(False) 38 self.sel.register(conn、selectors.EVENT_READ、self.read) ##connのレジスター 39 self.conn_dict [conn] = {} ##conn接続の完了を識別 40 41 def read (セルフ、コネチカット、マスク): #1 #通信サイクル 42は、 IF 否定 self.conn_dict [コネチカット州]: #1 #は、最初に来た 43である RES = conn.recv(BUFFER_SIZE) 44は RES = pickle.loads(RES) 45 ACTION = RESを[ ' アクション' ] 46 filename = res [ ' filename ' ] 47 filename = os.path.join(BASE_DIR、' files ' 、filename) 48 print(' ok ' ) 49 conn.sendall(b ' ready ') ##取得到动作和文件名 50 self.conn_dict [conn] = { ' action ':action、' filename ' :filename} 51 if hasattr(self、action): 52 func =GETATTR(セルフ、アクション) 53が FUNC(コネチカット州)、 54は 他: #1 #は、最初の着信でない 55 IF self.conn_dict [connは] [ ' アクション' ] == ' PUT ': ##アップロード 56は self.put_append(コネチカット) ##追加 57 58 def put_append(self、conn): 59 f = open(self.conn_dict [conn] [ ' filename ' ]、' ab ' ) 60 ifself.has_put <self.conn_dict [CONN] [ ' FILE_SIZE ' ]: 61件の データ= conn.recv(BUFFER_SIZE) # #接收正文 62 f.write(データ) 63 self.has_put + = LEN(データ) 64 f.close () 65 66 def put(self、conn): ##上传 67 print(' 能运行到put ' 、conn) 68 69 file_size = conn.recv(4 ) 70 file_size = struct.unpack(' i ' 、file_size) 71 self.conn_dict [conn] [ ' file_size ' ] = file_size 72 f = open(self.conn_dict [conn] [ ' filename ' ]、' wb ' ) 73 if self.has_put < file_size: 74 data = conn.recv( BUFFER_SIZE) # #接收正文 75 f.write(データ) 76 self.has_put + = LEN(データ) 77 f.close() 78 79 80 DEF得る(自己): # #下载 81 渡す 82 83 84 85 86 87 if __name__ == ' __main__ ' : 88 SelectorsServer()
1 ############クライアント端 2 インポートソケット、OS、ピクルス、構造体 3 ip_port =(' 192.168.43.182 '、8080 ) 4 BUFFER_SIZE = 1024 5 BASE_DIR = os.path.dirname(OS .path.abspath(__FILE__ )) 6 プリント(BASE_DIR) 7 クラスSelectorsClient: 8 DEF __init__ (自己): 9 self.creat_socket() 10 self.handle() 11 12 デフハンドル(自己): 13 ながら 1: 14 cmd_res = input(' >>>:' ) 15 action、filename = cmd_res.split() 16 send_dict = { 17 ' action ' :action、 18 ' filename ' :filename 19 } 20 self.client.sendall(pickle .dumps(send_dict)) ##传一个字典 21 recv_data = self.client.recv(buffer_size) 22 print (recv_data) 23 if hasattr(self、action): 24 FUNC = GETATTR(自己、アクション) 25 FUNC(ファイル名) 26 27 28 ##置く123.png 29 DEF置く(自己、ファイル名): # #上传操作 30 オープン(ファイル名と' RB ' Fとして): 31 データ= f.read() 32 の長さ= lenは(データ) 33 FILE_SIZE = struct.pack(' I ' 、長さ) 34 self.client.sendall(FILE_SIZE) # #发送文件大小 35 self.client.sendall(データ) ##伝達体 36 37 38である 39 ##GET 123.png 40 DEF GET(自己): # #ダウンロード動作 41は、 パス 42は 43である DEFのcreat_socket(自己): 44である self.client = ソケット。ソケット(はsocket.AF_INET、socket.SOCK_STREAM) 45 (ip_port用)self.client.connect 46が 47 IF __name__ == ' __main__ ' : 48 SelectorsClient()