zoukankan      html  css  js  c++  java
  • selectors 模块完成文件上传下载功能

     1 ############    server端
     2 
     3 import selectors,socket,time,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 class SelectorsServer:
    10     def __init__(self):
    11         self.conn_dict = {}
    12         self.has_put = 0
    13         self.has_get = 0
    14         self.sel = selectors.DefaultSelector()      ##  创建selectors 对象
    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     def handle(self):      ##  监听事件
    26          while 1:           ##  循环监听
    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):     ###     连接
    34         conn,addr = sock.accept()
    35         # print(conn)
    36         print('连接成功。。。')
    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(self,conn,mask):     ##  通信循环
    42         if not self.conn_dict[conn]:    ##  第一次进来
    43             res = conn.recv(buffer_size)
    44             res = pickle.loads(res)
    45             action = res['action']
    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:       ##  不是第一次进来
    55             if self.conn_dict[conn]['action'] == 'put':     ##  上传
    56                 self.put_append(conn)       ##  追加
    57 
    58     def put_append(self,conn):
    59         f = open(self.conn_dict[conn]['filename'],'ab')
    60         if self.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         pass
    82 
    83 
    84 
    85 
    86 
    87 if __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 class SelectorsClient:
     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(data)       ##  发送正文
    36 
    37 
    38 
    39     ##  get 123.png
    40     def get(self):          ##  下载操作
    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()
  • 相关阅读:
    Ctfshow Web入门
    Java复习笔记
    Saliency-Guided Attention Network for Image-Sentence Matching
    根据CSV文件生成ImageFolder格式数据集,并按比例划分训练集验证集
    Context-Aware Multi-View Summarization Network for Image-Text Matching
    Classes Matter: A Fine-grained Adversarial Approach to Cross-domain Semantic Segmentation
    GINet: Graph Interaction Network for Scene Parsing
    Neural Multimodal Cooperative Learning Toward Micro-Video Understanding
    GAN&cGAN&DCGAN
    循环神经网络
  • 原文地址:https://www.cnblogs.com/maoxinjueluo/p/12695135.html
Copyright © 2011-2022 走看看