From f96941cdca16cfb899c92bbd76733031e6e89d78 Mon Sep 17 00:00:00 2001 From: trian-gles <69212477+trian-gles@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:44:19 +0200 Subject: [PATCH] basic ws service for health detection --- websockets/check_system_status.py | 23 ++++++++++++++++ websockets/server.py | 46 +++++++++++++++++++++++++++++++ websockets/speaker_client.py | 20 ++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 websockets/check_system_status.py create mode 100644 websockets/server.py create mode 100644 websockets/speaker_client.py diff --git a/websockets/check_system_status.py b/websockets/check_system_status.py new file mode 100644 index 0000000..7d37331 --- /dev/null +++ b/websockets/check_system_status.py @@ -0,0 +1,23 @@ +import asyncio + +from websockets.asyncio.client import connect +import websockets + +async def init(): + uri = "ws://192.168.6.101:3003" + async with connect(uri) as websocket: + await websocket.send("status") + + while True: + try: + msg = await websocket.recv() + print(msg) + except websockets.ConnectionClosed: + print(f"Terminated by server") + break + except asyncio.exceptions.CancelledError: + print("Closed by user") + break + +if __name__ == "__main__": + asyncio.run(init()) \ No newline at end of file diff --git a/websockets/server.py b/websockets/server.py new file mode 100644 index 0000000..284bc73 --- /dev/null +++ b/websockets/server.py @@ -0,0 +1,46 @@ +import asyncio +from websockets.asyncio.server import serve +import websockets as ws +import time + +class SpeakerClient: + def __init__(self, connection, instance) -> None: + self.connection = connection + self.instance = instance + self.alive = True + + async def check_open(self): + try: + await self.connection.send("") + return True + except ws.ConnectionClosed: + return False + +CONNECTIONS = set() + + +async def handler(websocket): + async for message in websocket: + args = message.split('/') + if (args[0] == "speaker"): + CONNECTIONS.add(SpeakerClient(websocket, int(args[1]))) + print(f"New Speaker, instance {args[1]}") + if (args[0] == "status"): + print("Checking system health...") + remove_conns = [] + for c in CONNECTIONS: + status = await c.check_open() + if status: + print(f"Instance {c.instance} is alive") + await websocket.send(f"Instance {c.instance} is alive") + else: + remove_conns.append(c) + for c in remove_conns: + CONNECTIONS.remove(c) + + +async def main(): + async with serve(handler, "", 3003): + await asyncio.get_running_loop().create_future() # run forever + +asyncio.run(main()) \ No newline at end of file diff --git a/websockets/speaker_client.py b/websockets/speaker_client.py new file mode 100644 index 0000000..c4a8473 --- /dev/null +++ b/websockets/speaker_client.py @@ -0,0 +1,20 @@ +import asyncio + +from websockets.asyncio.client import connect +import websockets + +async def init(): + uri = "ws://192.168.6.101:3003" + async with connect(uri) as websocket: + await websocket.send("speaker/2") + + while True: + try: + await websocket.recv() + except websockets.ConnectionClosed: + print(f"Terminated by server") + break + + +if __name__ == "__main__": + asyncio.run(init()) \ No newline at end of file -- 2.45.2