Python проблема трансляции asyncio websocket - PullRequest
0 голосов
/ 06 апреля 2020

Я использую свой сервер веб-сокетов, используя 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()
...