|
|
|
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
|