net.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import json
  2. class Channel:
  3. def __init__(self, reader, writer):
  4. self.reader = reader
  5. self.writer = writer
  6. async def readline(self):
  7. if not (line := await self.reader.readline()):
  8. self.writer.close()
  9. return None
  10. # Strip the newline
  11. return line[:-1].decode()
  12. async def receive(self):
  13. if (plaintext := await self.readline()) is None:
  14. return None
  15. message = plaintext
  16. response = json.loads(message)
  17. return response
  18. async def send(self, obj):
  19. message = json.dumps(obj)
  20. data = message.encode()
  21. self.writer.write(data + b"\n")
  22. await self.writer.drain()
  23. async def _test_client():
  24. await asyncio.sleep(1)
  25. reader, writer = await asyncio.open_connection("127.0.0.1", 7643)
  26. channel = Channel(reader, writer)
  27. request = {
  28. "foo": "bar"
  29. }
  30. await channel.send(request)
  31. response = await channel.receive()
  32. print(f"Client: {response}")
  33. async def _test_server(reader, writer):
  34. channel = Channel(reader, writer)
  35. request = await channel.receive()
  36. print(f"Server: {request}")
  37. response = {
  38. "abc": "xyz"
  39. }
  40. await channel.send(response)
  41. async def _test_channel():
  42. server = await asyncio.start_server(_test_server, "127.0.0.1", 7643)
  43. task1 = asyncio.create_task(_test_client())
  44. async with server:
  45. task2 = asyncio.create_task(server.serve_forever())
  46. await asyncio.sleep(3)
  47. await task1
  48. task2.cancel()
  49. if __name__ == "__main__":
  50. import asyncio
  51. # run send and recv testes
  52. asyncio.run(_test_channel())