Server: parse client messages, handle 'init'
This commit is contained in:
parent
0465e66ee9
commit
48c467349d
|
|
@ -1,33 +1,59 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
# Example code from:
|
||||
# https://websockets.readthedocs.io/en/stable/intro.html
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import websockets
|
||||
|
||||
|
||||
def log_message_error(error, message_text):
|
||||
print(f"[E] {error}")
|
||||
print(f" Message: {message_text}")
|
||||
|
||||
|
||||
async def parse_client_message(websocket, message_text):
|
||||
"""Parse a message (JSON object) from a client."""
|
||||
|
||||
# TODO parse JSON
|
||||
response = f"Hello {message_text}!"
|
||||
try:
|
||||
# Parse JSON
|
||||
message = json.loads(message_text)
|
||||
|
||||
await websocket.send(response)
|
||||
# Handle message types
|
||||
if message['action'] == 'init':
|
||||
await handle_client_init(websocket, message)
|
||||
else:
|
||||
log_message_error(f"Unknown action '{message['action']}'", message_text)
|
||||
except json.decoder.JSONDecodeError as e:
|
||||
log_message_error(f"JSON decode error: {e}", message_text)
|
||||
except KeyError as e:
|
||||
log_message_error(f"Missing key {e} in JSON message", message_text)
|
||||
|
||||
|
||||
async def handle_client_init(websocket, message):
|
||||
"""Handle client 'init' message."""
|
||||
|
||||
print(f"< init: chat_id='{message['chat_id']}', nickname='{message['nickname']}'")
|
||||
|
||||
# Send response to client
|
||||
response = json.dumps({
|
||||
'type': 'init'
|
||||
})
|
||||
print(f"> {response}")
|
||||
await websocket.send(response)
|
||||
|
||||
|
||||
async def client_handler(websocket, path):
|
||||
"""Handle client connection."""
|
||||
|
||||
print(f"++ New client")
|
||||
print(f"++ New client {websocket.remote_address}")
|
||||
try:
|
||||
# Read and parse messages until connection is closed
|
||||
async for message_text in websocket:
|
||||
print(f"< {message_text}")
|
||||
await parse_client_message(websocket, message_text)
|
||||
except websockets.exceptions.ConnectionClosed:
|
||||
# Ignore ConnectionClosed exceptions because we handle this in finally
|
||||
pass
|
||||
finally:
|
||||
print(f"-- Client connection closed")
|
||||
print(f"-- Client connection closed {websocket.remote_address}")
|
||||
|
||||
# Create WebSocket listener
|
||||
start_server = websockets.serve(client_handler, '0.0.0.0', 32715)
|
||||
|
|
|
|||
Loading…
Reference in New Issue