Advertisement
Woobinda

asyncio Client

Aug 19th, 2017
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.03 KB | None | 0 0
  1. # asyncio echo client
  2.  
  3. import asyncio
  4. import functools
  5. import logging
  6. import sys
  7.  
  8. MESSAGES = [
  9.     b'This is the message. ',
  10.     b'It will be sent ',
  11.     b'in parts.',
  12. ]
  13. SERVER_ADDRESS = ('localhost', '10000')
  14.  
  15. logging.basicConfig(
  16.     level=logging.DEBUG,
  17.     format='%(name)s: %(message)s',
  18.     stream=sys.stderr,
  19. )
  20.  
  21. log = logging.getLogger('main')
  22.  
  23. event_loop = asyncio.get_event_loop()
  24.  
  25.  
  26. class EchoClient(asyncio.Protocol):
  27.  
  28.     def __init__(self, messages, future):
  29.         super().__init__()
  30.         self.messages = messages
  31.         self.log = logging.getLogger('EchoClient')
  32.         self.f = future
  33.  
  34.     def connection_made(self, transport):
  35.         self.transport = transport
  36.         self.address = transport.get_extra_info('peername')
  37.         self.log.debug(
  38.             'connecting to {} port {}'.format(*self.address)
  39.         )
  40.         for msg in self.messages:
  41.             transport.write(msg)
  42.             self.log.debug('sending {!r}'.format(msg))
  43.         # transoprt.writelines()
  44.         if transport.can_write_eof():
  45.             transport.write_eof()
  46.  
  47.     def data_received(self, data):
  48.         self.log.debug('received {!r}'.format(data))
  49.  
  50.     def eof_received(self):
  51.         self.log.debug('received EOF')
  52.         self.transport.close()
  53.         if not self.f.done():
  54.             self.f.set_result(True)
  55.  
  56.     def connection_lost(self, exc):
  57.         self.log.debug('server closed connection')
  58.         self.transport.close()
  59.         if not self.f.done():
  60.             self.f.set_result(True)
  61.         super().connection_lost(exc)
  62.  
  63. client_completed = asyncio.Future()
  64.  
  65. client_factory = functools.partial(
  66.     EchoClient,
  67.     messages=MESSAGES,
  68.     future=client_completed,
  69. )
  70. factory_coroutine = event_loop.create_connection(
  71.     client_factory,
  72.     *SERVER_ADDRESS,
  73. )
  74.  
  75. log.debug('waiting for client to complete')
  76. try:
  77.     event_loop.run_until_complete(factory_coroutine)
  78.     event_loop.run_until_complete(client_completed)
  79. finally:
  80.     log.debug('closing event loop')
  81.     event_loop.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement