1 # ########### servidor 端 2 3 selectores de importación , socket, hora, pickle, os, struct 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 selectores de clase Servidor : 10 def __init__ (self): 11 self.conn_dict = {} 12 self.has_put = 0 13 self.has_get =0 14 self.sel = selectores.DefaultSelector () # # 创建 selectores 对象 15 self.creat_socket () 16 self.handle () # # 监听 17 18 def creat_socket (self): # # 创建 socket 对象 19 sock = 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 defhandle (self): # # Listen for events 26 while 1: # # Loop listen 27 events = self.sel.select () 28 for key, mask in events: 29 callback = key.data 30 callback (key.fileobj, mask) 31 32 33 def accept (self, sock, mask): # ## Connection 34 conn, addr = sock.accept () 35 # print (conn) 36 print ( 'La conexión es exitosa ... ') 37 conn.setblocking (False) 38 self.sel.register (conn, selectors.EVENT_READ, self.read) # # Regístrese para conn 39 self.conn_dict [conn] = {} # # Identifique la conexión de conn. Completada 40 41 def read (self, conn, mask): # # Bucle de comunicación 42 si no es self.conn_dict [conn]: # # Primero en 43 res = conn.recv (buffer_size) 44 res = pickle.loads (res) 45 action = res [ ' acción ' ] 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 (self, action) 53 func (conn) 54 else : # # No es la primera vez en 55 si self.conn_dict [conn] [ ' action ' ] == ' put ' : # # Carga 56 self.put_append (conn) # # Agregado 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 data = conn.recv (buffer_size) # # 接收 正文 62 f.write (data) 63 self.has_put + = len (data) 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 (data) 76 self.has_put + = len (data) 77 f.close () 78 79 80 def get (self): # # 下载 81 pasar 82 83 84 85 86 87 si __name__ == ' __main__ ' : 88 SelectorsServer ()
1 # ########### client 端 2 import socket, os, pickle, struct 3 ip_port = ( ' 192.168.43.182 ' , 8080 ) 4 buffer_size = 1024 5 BASE_DIR = os.path.dirname (os .path.abspath ( __file__ )) 6 print (BASE_DIR) 7 selectores de clase Cliente : 8 def __init__ (self): 9 self.creat_socket () 10 self.handle () 11 12 def handle (self): 13 while 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 (self, action) 25 func (filename) 26 27 28 # # put 123.png 29 def put (self, filename): # # 上传 操作 30 with open (filename, ' rb ' ) as f: 31 data = f.read () 32 length = len (data) 33 file_size = struct.pack ( ' i ' , length) 34 self.client.sendall (file_size) # # 发送 文件 大小 35 self.client.sendall (datos) # # Enviar texto 36 37 38 39 # # get 123.png 40 def get (self): # # Operación de descarga 41 pass 42 43 def creat_socket (self): 44 self.client = socket. socket (socket.AF_INET, socket.SOCK_STREAM) 45 self.client.connect (ip_port) 46 47 if __name__ == ' __main__ ' : 48 SelectorsClient ()