当前位置: 首页 > 知识库问答 >
问题:

如何向所有geventwebsocket客户端广播消息

东门胤
2023-03-14

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'

共有1个答案

楚俊迈
2023-03-14

我想出来了。

通过像这样启动服务器

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") 
 类似资料:
  • 为了实现广播消息这一功能,简单的添加一个broadcast标志给emit和send方法的calls,广播意味着发送一个给所有socket(客户端)的消息,不过除了触发这一广播消息的socket(客户端)之外。 服务器端(app.js) var io = require('socket.io')(80); io.on('connection', function (socket) { sock

  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示

  • 在文档的socket.io客户端套接字部分http://socket.io/docs/client-api/#io#socket指的是套接字文档,这意味着服务器套接字对象和客户端套接字对象是相同的。

  • 问题内容: 我正在构建一个实时Web应用程序。 我希望能够从python应用程序的服务器端实现发送广播消息。 这是设置: 客户端上的 socketio.js TornadIO2 服务器作为Socket.IO服务器 *服务器端的 *python ( Django 框架) 我可以成功地将socket.io消息从客户端发送到服务器。服务器处理这些并可以发送响应。在下文中,我将描述我是如何做到的。 当前设

  • 我后来理解对了。实际上,我需要一条来自android客户端的MQTT消息发送到所有其他客户端,所以我想在消息正文中包含publish关键字,这是非常错误的。MQTT本身将接收到的消息发送给所有提供的客户端,如果客户端订阅了该主题的话。

  • 问题内容: 这段代码一切正常(将其缩短以便更好地阅读)。 当向服务器发送请求时,服务器会立即响应他。但是,其他客户端看不到响应消息。 因此,我想进一步说明:当客户端向服务器发送请求时,服务器将响应所有客户端,以便所有客户端都能看到消息。 我怎样才能做到这一点?有任何示例或不错的入门教程吗? 提前致谢! 服务器: 问题答案: 您必须使用连接池将消息广播到所有连接。您可以将其用作教程/示例http:/