Как передать сообщение всем клиентам geventwebsocket - PullRequest
0 голосов
/ 28 января 2019

Я настраиваю приложение geventwebscoket на python, используя gevent-websocket .

В одном из примеров (chat-app), который почти совпадает с моим приложением,Я определяю приложение, которое обрабатывает подключения к веб-сокету и сообщения, например:


import json

from gevent import monkey
monkey.patch_all()

from flask import Flask, render_template
from werkzeug.debug import DebuggedApplication

from geventwebsocket import WebSocketServer, WebSocketApplication, Resource

flask_app = Flask(__name__)
flask_app.debug = True


class ChatApplication(WebSocketApplication):
    def on_open(self):
        print("Some client connected!")

    def on_message(self, message):
        if message is None:
            return

        message = json.loads(message)

        if message['msg_type'] == 'message':
            self.broadcast(message)
        elif message['msg_type'] == 'update_clients':
            self.send_client_list(message)

    def send_client_list(self, message):
        current_client = self.ws.handler.active_client
        current_client.nickname = message['nickname']

        self.ws.send(json.dumps({
            'msg_type': 'update_clients',
            'clients': [
                getattr(client, 'nickname', 'anonymous')
                for client in self.ws.handler.server.clients.values()
            ]
        }))

    def broadcast(self, message):
        for client in self.ws.handler.server.clients.values():
            client.ws.send(json.dumps({
                'msg_type': 'message',
                'nickname': message['nickname'],
                'message': message['message']
            }))

    def on_close(self, reason):
        print("Connection closed!")


@flask_app.route('/')
def index():
    return render_template('index.html')

WebSocketServer(
    ('0.0.0.0', 8000),

    Resource([
        ('^/chat', ChatApplication),
        ('^/.*', DebuggedApplication(flask_app))
    ]),

    debug=False
).serve_forever()

Я хочу, чтобы в моем коде было несколько запланированных процессов, которые отправляют сообщение каждому клиенту, подключенному к веб-сокету.В примерах и ограниченной документации я не нахожу способа вызова метода широковещания откуда-то еще в проекте.Каждое сообщение / трансляция должна отправляться как реакция на полученное сообщение (насколько я понимаю).

Я пытался понять это, поэтому я пытался транслировать сообщение каждый раз, когда кто-то посещает страницу индекса:

@flask_app.route('/')
def index():
    chat_application = ChatApplication()
    chat_application.broadcast("A new user on the page!")
    return render_template('index.html')

Это приводит к ошибке:

chat_application = ChatApplication()
TypeError: __init__() missing 1 required positional argument: 'ws'

Короче говоря: я не знаю, как отправить сообщение каждому клиенту через веб-сокет, так как мне нужен экземпляр ChatApplication для доступа к функции трансляциии я не могу понять, как создать объект ChatApplication, чтобы позволить мне вызывать эту функцию.

1 Ответ

0 голосов
/ 28 января 2019

Я понял это.

Запустив такой сервер

server = WebSocketServer(
    ('0.0.0.0', 8000),

    Resource([
        ('^/chat', ChatApplication),
        ('^/.*', DebuggedApplication(flask_app))
    ]),

    debug=False
)

server.serve_forever()

, вы можете получить доступ ко всем клиентам и отправить им сообщение, подобное этому

for client in server.clients.values():
    client.ws.send("whatever you want to send") 
...