diff options
Diffstat (limited to 'third_party/python/aiohttp/examples/web_ws.py')
-rwxr-xr-x | third_party/python/aiohttp/examples/web_ws.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/third_party/python/aiohttp/examples/web_ws.py b/third_party/python/aiohttp/examples/web_ws.py new file mode 100755 index 0000000000..970f1506be --- /dev/null +++ b/third_party/python/aiohttp/examples/web_ws.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +"""Example for aiohttp.web websocket server +""" + +import os + +from aiohttp import web + +WS_FILE = os.path.join(os.path.dirname(__file__), "websocket.html") + + +async def wshandler(request): + resp = web.WebSocketResponse() + available = resp.can_prepare(request) + if not available: + with open(WS_FILE, "rb") as fp: + return web.Response(body=fp.read(), content_type="text/html") + + await resp.prepare(request) + + await resp.send_str("Welcome!!!") + + try: + print("Someone joined.") + for ws in request.app["sockets"]: + await ws.send_str("Someone joined") + request.app["sockets"].append(resp) + + async for msg in resp: + if msg.type == web.WSMsgType.TEXT: + for ws in request.app["sockets"]: + if ws is not resp: + await ws.send_str(msg.data) + else: + return resp + return resp + + finally: + request.app["sockets"].remove(resp) + print("Someone disconnected.") + for ws in request.app["sockets"]: + await ws.send_str("Someone disconnected.") + + +async def on_shutdown(app): + for ws in app["sockets"]: + await ws.close() + + +def init(): + app = web.Application() + app["sockets"] = [] + app.router.add_get("/", wshandler) + app.on_shutdown.append(on_shutdown) + return app + + +web.run_app(init()) |