セレクターモジュールはファイルのアップロードおよびダウンロード機能を完了します

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          ながら 114              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()

 

おすすめ

転載: www.cnblogs.com/maoxinjueluo/p/12695135.html
おすすめ