Advertisement
Guest User

Untitled

a guest
Feb 8th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.09 KB | None | 0 0
  1. import asyncio
  2. from struct import Struct
  3. import click
  4.  
  5.  
  6. PORT = 8887
  7. ENC = 'utf-8'
  8.  
  9. DATA = {}
  10.  
  11.  
  12. def perform_GET(key):
  13.     return DATA.get(key, b'')
  14.  
  15.  
  16. def perform_SET(key, value):
  17.     DATA[key] = value
  18.     return b'1'
  19.  
  20.  
  21. pkt_len = Struct('!I')
  22.  
  23.  
  24. async def handle_connection(reader, writer):
  25.     try:
  26.         while True:
  27.             cmdlen = pkt_len.unpack(await reader.readexactly(pkt_len.size))[0]
  28.             data = await reader.readexactly(cmdlen)
  29.             cmd, params = data.split(b' ', 1)
  30.  
  31.             if cmd == b'GET':
  32.                 result = perform_GET(params)
  33.             elif cmd == b'SET':
  34.                 result = perform_SET(*params.split(b' ', 1))
  35.             else:
  36.                 result = b'ERROR'
  37.  
  38.             writer.write(pkt_len.pack(len(result)))
  39.             writer.write(result)
  40.             await writer.drain()
  41.     except asyncio.streams.IncompleteReadError:
  42.         writer.close()
  43.  
  44.  
  45. async def issue_client(loop, cmd):
  46.     reader, writer = await asyncio.open_connection('127.0.0.1', PORT, loop=loop)
  47.  
  48.     writer.write(pkt_len.pack(len(cmd)))
  49.     writer.write(cmd)
  50.  
  51.     datalen = pkt_len.unpack(await reader.readexactly(pkt_len.size))[0]
  52.     data = await reader.readexactly(datalen)
  53.  
  54.     writer.close()
  55.     return data
  56.  
  57.  
  58. @click.group()
  59. def cli():
  60.     pass
  61.  
  62.  
  63. @cli.command()
  64. @click.argument('cmd', nargs=-1)
  65. def client(cmd):
  66.     loop = asyncio.get_event_loop()
  67.     result = loop.run_until_complete(issue_client(loop, ' '.join(cmd).encode(ENC)))
  68.     loop.close()
  69.     click.echo(result.decode(ENC))
  70.  
  71.  
  72. @cli.command()
  73. def server():
  74.     loop = asyncio.get_event_loop()
  75.     coro = asyncio.start_server(handle_connection, '0.0.0.0', PORT, loop=loop)
  76.     server = loop.run_until_complete(coro)
  77.  
  78.     # Serve requests until Ctrl+C is pressed
  79.     print('Serving on {}'.format(server.sockets[0].getsockname()))
  80.     try:
  81.         loop.run_forever()
  82.     except KeyboardInterrupt:
  83.         pass
  84.  
  85.     # Close the server
  86.     server.close()
  87.     loop.run_until_complete(server.wait_closed())
  88.     loop.close()
  89.  
  90.  
  91. if __name__ == '__main__':
  92.     cli()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement