Я использую свой сервер веб-сокетов, используя gunicorn и supervisor. У нас есть много клиентов, которые подключаются к серверу websocket и хранятся в наборе connections
.
Изначально все работает нормально. Клиенты получают сообщения pu sh с сервера. Через некоторое время или когда один из клиентов обновляет страницу, он прекращает получать сообщение pu sh с сервера.
Когда клиенты отправляют эхо-запросы на сервер, они все равно получают хороший ответ от pong. Код, который отправляет сообщения клиентам, все еще запускается. Но клиенты их не получают.
Надеюсь, что кто-нибудь найдет проблему.
import datetime
import json
import os
import asyncio
import websockets
from pinn.storage.postgresql import user_store
connections = set()
async def handler(websocket, path):
while True:
msg = json.loads(await websocket.recv())
if 'X-API-Key' in msg:
user_id = user_store.fetch_user_id_by_api_key(msg['X-API-Key'])
if user_id is not None:
if websocket not in connections:
connections.add(websocket)
await websocket.send(json.dumps({'message': 'user registered'}))
else:
await websocket.send(json.dumps({'message': 'user already registered'})
elif 'ping' in msg:
if websocket in connections:
await websocket.send(json.dumps({'pong': datetime.datetime.now().strftime('%d-%m-%Y %H:%M:%S')}))
# here the websocket server handles messages from another server on localhost for broadcasting.
elif websocket.remote_address[0].startswith('127.0.0') and 'X-API-Key' not in msg:
for connection in connections:
await connection.send(json.dumps(msg))
start_server = websockets.serve(handler, os.getenv('PINN_WPS_WEBSOCKET_HOST'), os.getenv('PINN_WPS_WEBSOCKET_PORT'))
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()