async def start_client(self) -> None: """ Startup function for a client. """ if hasattr(Config().algorithm, 'cross_silo') and not Config().is_edge_server(): # Contact one of the edge servers if hasattr(Config().clients, 'simulation') and Config().clients.simulation: self.edge_server_id = int( Config().clients.per_round) + (self.client_id - 1) % int( Config().algorithm.total_silos) + 1 else: self.edge_server_id = int(Config().clients.total_clients) + ( self.client_id - 1) % int( Config().algorithm.total_silos) + 1 logging.info("[Client #%d] Contacting Edge server #%d.", self.client_id, self.edge_server_id) else: await asyncio.sleep(5) logging.info("[Client #%d] Contacting the central server.", self.client_id) self.sio = socketio.AsyncClient(reconnection=True) self.sio.register_namespace( ClientEvents(namespace='/', plato_client=self)) if hasattr(Config().server, 's3_endpoint_url'): self.s3_client = s3.S3() if hasattr(Config().server, 'use_https'): uri = 'https://{}'.format(Config().server.address) else: uri = 'http://{}'.format(Config().server.address) if hasattr(Config().server, 'port'): # If we are not using a production server deployed in the cloud if hasattr(Config().algorithm, 'cross_silo') and not Config().is_edge_server(): uri = '{}:{}'.format( uri, int(Config().server.port) + int(self.edge_server_id)) else: uri = '{}:{}'.format(uri, Config().server.port) logging.info("[Client #%d] Connecting to the server at %s.", self.client_id, uri) await self.sio.connect(uri) await self.sio.emit('client_alive', {'id': self.client_id}) logging.info("[Client #%d] Waiting to be selected.", self.client_id) await self.sio.wait()
def start(self, port=Config().server.port): """ Start running the socket.io server. """ logging.info("Starting a server at address %s and port %s.", Config().server.address, port) self.sio = socketio.AsyncServer(ping_interval=self.ping_interval, max_http_buffer_size=2**31, ping_timeout=self.ping_timeout) self.sio.register_namespace( ServerEvents(namespace='/', plato_server=self)) if hasattr(Config().server, 's3_endpoint_url'): self.s3_client = s3.S3() app = web.Application() self.sio.attach(app) web.run_app(app, host=Config().server.address, port=port, loop=asyncio.get_event_loop())