refactored

This commit is contained in:
2026-03-08 15:47:38 +01:00
parent e0a26c8d76
commit 1b9d07db7f
+20 -21
View File
@@ -1,58 +1,57 @@
import socket import socket
import selectors import selectors
from copy import deepcopy
import time import time
class MultiClient(object): class MultiClient(object):
def __init__(self, servers: list[dict]): def __init__(self, servers: list[dict]):
self.servers = servers self.sock_list = [{'name': s['name'], 'addr': (s['host'], s['port'])} for s in servers]
self.sock_list = deepcopy(self.servers)
self.sel = None self.sel = None
for server in self.sock_list: for server in self.sock_list:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(False) sock.setblocking(False)
server['sock'] = sock server['sock'] = sock
def find_by_addr(self, addr):
for sock in self.sock_list:
if sock['addr'] == addr:
return sock
return None
def connect(self): def connect(self):
self.sel = selectors.DefaultSelector() self.sel = selectors.DefaultSelector()
events = selectors.EVENT_READ events = selectors.EVENT_READ
for sock in self.sock_list: for sock in self.sock_list:
print(f"Starting connection {sock['name']} to {sock['host']}:{sock['port']}") print(f"Starting connection {sock['name']} to {sock['addr']}")
self.sel.register(sock['sock'], events, data=None) self.sel.register(sock['sock'], events, data=None)
sock['sock'].connect_ex((sock['host'], sock['port'])) sock['sock'].connect_ex(sock['addr'])
def disconnect(self): def disconnect(self):
for sock in self.sock_list: for sock in self.sock_list:
sock['sock'].close() sock['sock'].close()
def on_receive(self, key): def on_receive(self, rx_list: list):
data = key.fileobj.recv(1024) for data in rx_list:
print(f"{self}: on_receive: {data}") print(f"{self}: on_receive: 'Time': {data['timestamp'], data['name']}")
def on_send(self, key):
return None
def send_request(self): def send_request(self):
events = selectors.EVENT_READ | selectors.EVENT_WRITE events = selectors.EVENT_READ | selectors.EVENT_WRITE
for sock in self.sock_list: for sock in self.sock_list:
self.sel.register(sock['sock'], events, data=kakac) self.sel.register(sock['sock'], events, data=None)
print("receive") print("receive")
def event_loop(self): def event_loop(self):
try: try:
while True: while True:
events = self.sel.select(timeout=1) events = self.sel.select(timeout=1)
rx_data = []
for key, mask in events: for key, mask in events:
descr = self.find_by_addr(key.fileobj.getpeername())
if mask & selectors.EVENT_READ: if mask & selectors.EVENT_READ:
self.on_receive(key) timestamp = time.time()
if mask & selectors.EVENT_WRITE: data = key.fileobj.recv(1024)
data = self.on_send(key) rx_data.append({'timestamp': timestamp, 'name': descr['name'], 'data': data})
if data is None:
events = selectors.EVENT_READ self.on_receive(rx_data)
for sock in self.sock_list:
self.sel.register(sock['sock'], events, data=None)
except KeyboardInterrupt: except KeyboardInterrupt:
print("Caught keyboard interrupt, exiting") print("Caught keyboard interrupt, exiting")