websockets are great
This commit is contained in:
Executable
+20
@@ -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()
|
||||
@@ -0,0 +1,80 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebSocket demo</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
font-family: "Courier New", sans-serif;
|
||||
text-align: center;
|
||||
}
|
||||
.buttons {
|
||||
font-size: 4em;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.button, .value {
|
||||
line-height: 1;
|
||||
padding: 2rem;
|
||||
margin: 2rem;
|
||||
border: medium solid;
|
||||
min-height: 1em;
|
||||
min-width: 1em;
|
||||
}
|
||||
.button {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
.minus {
|
||||
color: red;
|
||||
}
|
||||
.plus {
|
||||
color: green;
|
||||
}
|
||||
.value {
|
||||
min-width: 2em;
|
||||
}
|
||||
.state {
|
||||
font-size: 2em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="buttons">
|
||||
<div class="minus button">-</div>
|
||||
<div class="value">?</div>
|
||||
<div class="plus button">+</div>
|
||||
</div>
|
||||
<div class="state">
|
||||
<span class="users">?</span> online
|
||||
</div>
|
||||
<script>
|
||||
var minus = document.querySelector('.minus'),
|
||||
plus = document.querySelector('.plus'),
|
||||
value = document.querySelector('.value'),
|
||||
users = document.querySelector('.users'),
|
||||
websocket = new WebSocket("ws://127.0.0.1:6789/");
|
||||
minus.onclick = function (event) {
|
||||
websocket.send(JSON.stringify({action: 'minus'}));
|
||||
}
|
||||
plus.onclick = function (event) {
|
||||
websocket.send(JSON.stringify({action: 'plus'}));
|
||||
}
|
||||
websocket.onmessage = function (event) {
|
||||
data = JSON.parse(event.data);
|
||||
switch (data.type) {
|
||||
case 'state':
|
||||
value.textContent = data.value;
|
||||
break;
|
||||
case 'users':
|
||||
users.textContent = (
|
||||
data.count.toString() + " user" +
|
||||
(data.count == 1 ? "" : "s"));
|
||||
break;
|
||||
default:
|
||||
console.error(
|
||||
"unsupported event", data);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebSocket demo</title>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
var ws = new WebSocket("ws://127.0.0.1:5678/"),
|
||||
messages = document.createElement('ul');
|
||||
ws.onmessage = function (event) {
|
||||
var messages = document.getElementsByTagName('ul')[0],
|
||||
message = document.createElement('li'),
|
||||
content = document.createTextNode(event.data);
|
||||
message.appendChild(content);
|
||||
messages.appendChild(message);
|
||||
};
|
||||
document.body.appendChild(messages);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Executable
+69
@@ -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()
|
||||
Executable
+19
@@ -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()
|
||||
Executable
+19
@@ -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())
|
||||
Executable
+20
@@ -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()
|
||||
Reference in New Issue
Block a user