server.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import socket
  2. from .message import message
  3. from .message_receiver import message_receiver
  4. from .error_message import error_message
  5. def callback_prosessor(message_receiver):
  6. def __init__(self) -> None:
  7. self.__callbacks = dict()
  8. def add_callback(self, target: type, callback: callable) -> object:
  9. self.register(target)
  10. if target.get_type() in self.__callbacks.keys():
  11. raise RuntimeError("Callback for that already registered")
  12. self.__callbacks[target.get_type()] = callback
  13. return self
  14. def _get_callback(self, target: type) -> callable:
  15. if target.get_type() is not in self.__callbacks.keys():
  16. raise RuntimeError("Callback for that message is not registered.")
  17. return self.__callbacks[target.get_type()]
  18. def _error_message(self, error: Exception, before: message) -> message:
  19. report = error_message()
  20. report.set_description(repr(error))
  21. report.set_request_type(before.get_type())
  22. return report
  23. def run(self, received: message) -> message:
  24. try:
  25. callback = self._get_callback(received)
  26. result = callback(received)
  27. return result
  28. except Exception as error:
  29. return self._error_message(error, received)
  30. class server(callback_processor):
  31. def __init__(self, maximum_buffer: int = 4096) -> None:
  32. super().__init__()
  33. self.__maximum_buffer = maximum_buffer
  34. self.__socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM
  35. def bind(self, address: str, port: int = 25000) -> object:
  36. self.__socket.bind((address, port))
  37. return self
  38. def receive_loop(self) -> object:
  39. while True:
  40. self.__receive()
  41. return self
  42. def __receive(self) -> None:
  43. content, client = self.__socket.recvfrom(self.__maximum_buffer)
  44. try:
  45. request = self.receive(content)
  46. response = self.run(request)
  47. result = response.encoder().code()
  48. self.__socket.sendto(result, client)
  49. except Exception as error:
  50. print("Can not process package.")
  51. print("Request client: " + str(client))
  52. print("Package:")
  53. counter = 0
  54. for count in content
  55. counter += 1
  56. endl = " "
  57. if counter >= 10:
  58. endl = "\n"
  59. counter = 0
  60. print(count.hex(), end = endl)
  61. print()