import socket import selectors from copy import deepcopy import time class MultiClient(object): def __init__(self, servers: list[dict]): self.servers = servers self.sock_list = deepcopy(self.servers) self.sel = None for server in self.sock_list: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(False) server['sock'] = sock def connect(self): self.sel = selectors.DefaultSelector() events = selectors.EVENT_READ for sock in self.sock_list: print(f"Starting connection {sock['name']} to {sock['host']}:{sock['port']}") self.sel.register(sock['sock'], events, data=None) sock['sock'].connect_ex((sock['host'], sock['port'])) def disconnect(self): for sock in self.sock_list: sock['sock'].close() def on_receive(self, key): data = key.fileobj.recv(1024) print(f"{self}: on_receive: {data}") def on_send(self, key): return None def send_request(self): events = selectors.EVENT_READ | selectors.EVENT_WRITE for sock in self.sock_list: self.sel.register(sock['sock'], events, data=kakac) print("receive") def event_loop(self): try: while True: events = self.sel.select(timeout=1) for key, mask in events: if mask & selectors.EVENT_READ: self.on_receive(key) if mask & selectors.EVENT_WRITE: data = self.on_send(key) if data is None: events = selectors.EVENT_READ for sock in self.sock_list: self.sel.register(sock['sock'], events, data=None) except KeyboardInterrupt: print("Caught keyboard interrupt, exiting") finally: self.sel.close() if __name__ == "__main__": server_list = [ {'name': "neo-f9p", 'host': "192.168.22.93", 'port': 8721}, {'name': "zed-x20p", 'host': "192.168.22.93", 'port': 8731} ] mc = MultiClient(server_list) mc.connect() mc.event_loop() time.sleep(1) mc.disconnect()