El módulo de selectores completa las funciones de carga y descarga de archivos.

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 ()

 

Supongo que te gusta

Origin www.cnblogs.com/maoxinjueluo/p/12695135.html
Recomendado
Clasificación