import asyncio from functools import wraps import socketio import socket def get_ip_address(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # This IP address doesn't need to be reachable, as we're only using it to find the local IP address s.connect(("10.255.255.255", 1)) ip = s.getsockname()[0] except Exception: ip = "127.0.0.1" finally: s.close() return ip # Update these with the correct values for your host and server sio = socketio.AsyncClient() async def _announce_server(**kwargs): HOST_SERVER_IP = "0.0.0.0" HOST_SERVER_PORT = 4999 SERVER_NAME = "server_1" SERVER_PORT = 8000 SERVER_NAME = kwargs.get("name", SERVER_NAME) SERVER_IP = kwargs.get("ip", get_ip_address()) SERVER_PORT = kwargs.get("port", SERVER_PORT) HOST_SERVER_IP = kwargs.get("host_ip", HOST_SERVER_IP) HOST_SERVER_PORT = kwargs.get("host_port", HOST_SERVER_PORT) @sio.event async def connect(): await sio.emit('register', {'name': SERVER_NAME, 'ip': SERVER_IP, 'port': SERVER_PORT}) print("Announced server to host") async def main(): # retry until we connect to the host while True: try: await sio.connect(f'http://{HOST_SERVER_IP}:{HOST_SERVER_PORT}') break except Exception as e: print(e) print("Failed to connect to host, retrying in 5 seconds") await asyncio.sleep(5) # await sio.connect(f'http://{HOST_SERVER_IP}:{HOST_SERVER_PORT}') print("Connected to host") @sio.on("heartbeat") async def on_heartbeat(): print("Received heartbeat from host") @sio.event async def disconnect(): print("Disconnected from host") await main() def announce_server(task=None, **outer_kwargs): if task is None: return lambda f: announce_server(f, **outer_kwargs) @wraps(task) def wrapper(*args, **kwargs): async def main(*args, **kwargs): loop = asyncio.get_event_loop() host_block_thread = loop.run_in_executor(None, task) # Announce the server to the host await _announce_server(**outer_kwargs) # Wait for host_block to finish await host_block_thread return asyncio.run(main()) return wrapper