The server part is composed of three different classes.
EchoServer, which orchestrates the server and provides the high-level API we can use. EchoRequestHandler, which manages the incoming messages and serves them. And ThreadedTCPServer, which is in charge of the whole networking part, opening sockets, listening on them, and spawning threads to handle connections.
EchoServer allows to start and stop our server:
class EchoServer: def __init__(self, host='0.0.0.0', port=9800): self._host = host self._port = port self._server = ThreadedTCPServer((host, port), EchoRequestHandler) self._thread = threading.Thread(target=self._server.serve_forever) self._thread.daemon = True def start(self): if self._thread.is_alive(): # Already ...