From f97d140ecb6c3bed50c9541d94b88648cc085a15 Mon Sep 17 00:00:00 2001 From: Marc Partensky Date: Fri, 27 Nov 2020 21:26:18 +0100 Subject: [PATCH] websockets are great --- Tests/test-websocket.py | 20 +++++++ WebSocket/browserbased-client-v2.html | 80 +++++++++++++++++++++++++++ WebSocket/browserbased-client.html | 20 +++++++ WebSocket/browserbased-server-v2.py | 69 +++++++++++++++++++++++ WebSocket/browserbased-server.py | 19 +++++++ WebSocket/client.py | 19 +++++++ WebSocket/server.py | 20 +++++++ 7 files changed, 247 insertions(+) create mode 100755 Tests/test-websocket.py create mode 100644 WebSocket/browserbased-client-v2.html create mode 100644 WebSocket/browserbased-client.html create mode 100755 WebSocket/browserbased-server-v2.py create mode 100755 WebSocket/browserbased-server.py create mode 100755 WebSocket/client.py create mode 100755 WebSocket/server.py diff --git a/Tests/test-websocket.py b/Tests/test-websocket.py new file mode 100755 index 0000000..c8ab699 --- /dev/null +++ b/Tests/test-websocket.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# WS server example + +import asyncio +import websockets + +async def hello(websocket, path): + name = await websocket.recv() + print(f"< {name}") + + greeting = f"Hello {name}!" + + await websocket.send(greeting) + print(f"> {greeting}") + +start_server = websockets.serve(hello, "localhost", 8765) + +asyncio.get_event_loop().run_until_complete(start_server) +asyncio.get_event_loop().run_forever() diff --git a/WebSocket/browserbased-client-v2.html b/WebSocket/browserbased-client-v2.html new file mode 100644 index 0000000..6310c4a --- /dev/null +++ b/WebSocket/browserbased-client-v2.html @@ -0,0 +1,80 @@ + + + + WebSocket demo + + + +
+
-
+
?
+
+
+
+
+ ? online +
+ + + diff --git a/WebSocket/browserbased-client.html b/WebSocket/browserbased-client.html new file mode 100644 index 0000000..721f442 --- /dev/null +++ b/WebSocket/browserbased-client.html @@ -0,0 +1,20 @@ + + + + WebSocket demo + + + + + diff --git a/WebSocket/browserbased-server-v2.py b/WebSocket/browserbased-server-v2.py new file mode 100755 index 0000000..b3d6a23 --- /dev/null +++ b/WebSocket/browserbased-server-v2.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +# WS server example that synchronizes state across clients + +import asyncio +import json +import logging +import websockets + +logging.basicConfig() + +STATE = {"value": 0} + +USERS = set() + + +def state_event(): + return json.dumps({"type": "state", **STATE}) + + +def users_event(): + return json.dumps({"type": "users", "count": len(USERS)}) + + +async def notify_state(): + if USERS: # asyncio.wait doesn't accept an empty list + message = state_event() + await asyncio.wait([user.send(message) for user in USERS]) + + +async def notify_users(): + if USERS: # asyncio.wait doesn't accept an empty list + message = users_event() + await asyncio.wait([user.send(message) for user in USERS]) + + +async def register(websocket): + USERS.add(websocket) + await notify_users() + + +async def unregister(websocket): + USERS.remove(websocket) + await notify_users() + + +async def counter(websocket, path): + # register(websocket) sends user_event() to websocket + await register(websocket) + try: + await websocket.send(state_event()) + async for message in websocket: + data = json.loads(message) + if data["action"] == "minus": + STATE["value"] -= 1 + await notify_state() + elif data["action"] == "plus": + STATE["value"] += 1 + await notify_state() + else: + logging.error("unsupported event: {}", data) + finally: + await unregister(websocket) + + +start_server = websockets.serve(counter, "localhost", 6789) + +asyncio.get_event_loop().run_until_complete(start_server) +# asyncio.get_event_loop().run_forever() diff --git a/WebSocket/browserbased-server.py b/WebSocket/browserbased-server.py new file mode 100755 index 0000000..d645d9d --- /dev/null +++ b/WebSocket/browserbased-server.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# WS server that sends messages at random intervals + +import asyncio +import datetime +import random +import websockets + +async def time(websocket, path): + while True: + now = datetime.datetime.utcnow().isoformat() + "Z" + await websocket.send('moche') + await asyncio.sleep(2) + +start_server = websockets.serve(time, "127.0.0.1", 5678) + +asyncio.get_event_loop().run_until_complete(start_server) +asyncio.get_event_loop().run_forever() diff --git a/WebSocket/client.py b/WebSocket/client.py new file mode 100755 index 0000000..4f969c4 --- /dev/null +++ b/WebSocket/client.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +# WS client example + +import asyncio +import websockets + +async def hello(): + uri = "ws://localhost:8765" + async with websockets.connect(uri) as websocket: + name = input("What's your name? ") + + await websocket.send(name) + print(f"> {name}") + + greeting = await websocket.recv() + print(f"< {greeting}") + +asyncio.get_event_loop().run_until_complete(hello()) diff --git a/WebSocket/server.py b/WebSocket/server.py new file mode 100755 index 0000000..c8ab699 --- /dev/null +++ b/WebSocket/server.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +# WS server example + +import asyncio +import websockets + +async def hello(websocket, path): + name = await websocket.recv() + print(f"< {name}") + + greeting = f"Hello {name}!" + + await websocket.send(greeting) + print(f"> {greeting}") + +start_server = websockets.serve(hello, "localhost", 8765) + +asyncio.get_event_loop().run_until_complete(start_server) +asyncio.get_event_loop().run_forever()