server.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import socket
  2. from threading import Thread
  3. class SocketServer(Thread):
  4. __BLOCK_SIZE = 1024
  5. def __init__(self, host: "str", port: "int"):
  6. super().__init__()
  7. self.__socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. self.__socket.bind((host, port))
  9. self.__socket.listen(1)
  10. self.__server_msg = f"server running on ws://{host}:{port}"
  11. self.__clients, self.__handlers = [], {}
  12. def __receive(self, client: "socket.socket"):
  13. try:
  14. buffer = b""
  15. while True:
  16. buffer += client.recv(SocketServer.__BLOCK_SIZE)
  17. while (index := buffer.find(b"==END==")) > -1:
  18. pool, buffer = buffer[:index], buffer[index + 7:]
  19. index = pool.find(b"==EVENT:")
  20. if index != -1:
  21. pool = pool[index + 8:]
  22. index = pool.find(b"==")
  23. self.__event_handler(client, pool[:index].decode("utf-8"), pool[index + 2:])
  24. finally:
  25. client.close()
  26. def __event_handler(self, client: "socket.socket", event: "str", data):
  27. if event in self.__handlers.keys():
  28. Thread(target=self.__handlers[event], args=(client, data), name=f"{event}-handler").start()
  29. def on(self, event: "str"):
  30. def decorator(func):
  31. self.__handlers[event] = func
  32. return func
  33. return decorator
  34. @staticmethod
  35. def emit(client: "socket.socket", event: "str", msg: "bytes" = b""):
  36. client.sendall(f"==EVENT:{event}==".encode("utf-8") + msg + b"==END==")
  37. def broadcast(self, msg: "bytes"):
  38. for client in self.__clients:
  39. self.emit(client, "bios", msg)
  40. def run(self) -> None:
  41. print(self.__server_msg)
  42. while True:
  43. client, addr = self.__socket.accept()
  44. self.__event_handler(client, "connect", addr)
  45. Thread(target=self.__receive, args=(client,), name=f"{addr}-receiver").start()