Advertisement
brisher777

asyncio project

Nov 27th, 2014
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.52 KB | None | 0 0
  1. import asyncio
  2. import logging
  3.  
  4.  
  5. class MyServer:
  6.     def __init__(self, loop):
  7.         self.server = None
  8.         self.loop = loop
  9.         self.clients = dict()
  10.         self.log = logging.getLogger(__name__)
  11.  
  12.     def _accept_client(self, client_reader, client_writer):
  13.         """ Client initially drops in here """
  14.         task = asyncio.Task(self._handle_client(client_reader, client_writer))
  15.         self.clients[task] = (client_reader, client_writer)
  16.  
  17.         def client_done(task):
  18.             self.clients[task][1].close()  # closes the StreamWriter that was part of the task
  19.             del self.clients[task]
  20.  
  21.         self.log.info("New connection.")
  22.         task.add_done_callback(client_done)
  23.  
  24.     @asyncio.coroutine
  25.     def _handle_client(self, client_reader, client_writer):
  26.         """ Try to connect to port 22 and broker between 2 connections.
  27.  
  28.        :param client_reader: StreamReader object
  29.        :param client_writer: StreamWriter object
  30.        """
  31.         reader, writer = yield from asyncio.async(asyncio.open_connection('localhost', 22))
  32.  
  33.         while True:
  34.             client_data = yield from asyncio.async(self.read_data(client_reader))
  35.             if client_data:
  36.                 writer.write(client_data)
  37.                 yield from writer.drain()
  38.                
  39.             server_data = yield from asyncio.async(self.read_data(reader))
  40.             if server_data:
  41.                 client_writer.write(server_data)
  42.                 yield from client_writer.drain()
  43.  
  44.  
  45.     @asyncio.coroutine
  46.     def read_data(self, reader):
  47.         data = None
  48.  
  49.         while True:
  50.             print('top of while')
  51.             data = yield from asyncio.Task(reader.read(2048))
  52.             return data
  53.  
  54.     def start(self):
  55.         """ start the server listening on 12345 """
  56.  
  57.         self.server = self.loop.run_until_complete(
  58.             asyncio.streams.start_server(
  59.                 self._accept_client,                 # client_connected_callback
  60.                 'localhost',                         # host
  61.                 12345,                               # port
  62.                 loop=self.loop                       # loop
  63.             )
  64.         )
  65.  
  66.     def stop(self):
  67.         if self.server:
  68.             self.server.close()
  69.             self.loop.run_until_complete(self.server.wait_closed())
  70.             self.server = None
  71.  
  72. if __name__ == '__main__':
  73.     loop = asyncio.get_event_loop()
  74.     my_server = MyServer(loop)
  75.     my_server.start()
  76.     loop.run_forever()
  77.     my_server.stop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement