Voici un exemple de code permettant une diffusion de message avec les WebSocket.
La démonstration est composé de 3 programmes:
- Le serveur WebSocket en python qui accepte les connexion
- Un client WebSocket en python qui emet des messages
- Un client WebSocket en Javascipt dans une page html qui affiche les messages
Les clients se connectent sur les différentes URL:
- ws://127.0.0.1:5678/broadcast/read : Pour lire les messages diffusés
- ws://127.0.0.1:5678/broadcast/write : Pour diffuser un message
Le serveur:
#!/usr/bin/env python3
import asyncio
import datetime
import random
import websockets
connected = set()
async def pub_sub(websocket, path):
global connected
if path == '/broadcast/read' :
connected.add(websocket)
print("READER "+str(websocket.remote_address)+" connected")
while True:
await asyncio.sleep(100)
elif path == '/broadcast/write' :
print("WRITER "+str(websocket.remote_address)+" connected")
try :
while True:
data = await websocket.recv()
print("MULTICAST: "+data)
still_connected = set()
for ws in connected :
if ws.open:
still_connected.add(ws)
await asyncio.wait([ws.send(data)])
else:
print("READER "+str(ws.remote_address)+" disconnected")
connected=still_connected
except:
print("WRITER "+str(websocket.remote_address)+" disconnected")
start_server = websockets.serve(pub_sub, '127.0.0.1', 5678)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Le client python qui emet des messages
#!/usr/bin/env python3
import asyncio
import websockets
async def hello():
async with websockets.connect('ws://localhost:5678/broadcast/write') as websocket:
while True:
name = input("Message ? ")
await websocket.send(name)
asyncio.get_event_loop().run_until_complete(hello())
La ou les pages html qui recoivent les messages:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket demo</title>
</head>
<body>
<script>
var ws = new WebSocket("ws://127.0.0.1:5678/broadcast/read"),
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>