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