python websockets 怎么使用广播?

 ###### python websockets

 ###### 求广播推送方式

 ###### 官方给出的示:broadcast()


```python


import asyncio

import websockets

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)


asyncio.get_event_loop().run_until_complete(

    websockets.serve(echo, '127.0.0.1', 5000))

asyncio.get_event_loop().run_forever()



class SimpleEcho(WebSocket):

    def handleMessage(self):
        if self.data is None:
            self.data = ''

        for client in self.server.connections.itervalues():
            client.sendMessage(str(self.address[0]) + ' - ' + str(self.data))

        #echo message back to client
        #self.sendMessage(str(self.data))

    def handleConnected(self):
        print self.address, 'connected'

    def handleClose(self):
        print self.address, 'closed'

很简单,可以向已经连接的所有客户端推送消息,一个简单的例子


class SimpleEcho(WebSocket):

    def handleMessage(self):
        if self.data is None:
            self.data = ''

        for client in self.server.connections.itervalues():
            client.sendMessage(str(self.address[0]) + ' - ' + str(self.data))

        #echo message back to client
        #self.sendMessage(str(self.data))

    def handleConnected(self):
        print self.address, 'connected'

    def handleClose(self):
        print self.address, 'closed'

server.py


import json, time, random
from flask import Flask, render_template
from flask import request
from flask import make_response
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
from threading import Thread

# 实例化产生一个Flask对象
app = Flask(__name__)
WS_LIST = []
count = 0


# flask的路由是基于装饰器的
@app.route('/', methods=['GET', 'POST'])
def hello_world():
    return render_template("index.html")


@app.route("/main")
def func():
    global count
    ws = request.environ.get('wsgi.websocket')
    if not ws:
        print('【客户端退出1】', str(ws))
        return make_response("error", 404)
    WS_LIST.append(ws)
    print('len(WS_LIST)', len(WS_LIST))  # 客户端数量

    while True:
        # 等待用户发送消息,并接受
        message = ws.receive()

        # 关闭:message=None
        if not message:
            try:
                print('【客户端退出2】', str(ws))
                WS_LIST.remove(ws)
                del ws
                print('len(WS_LIST)', len(WS_LIST))
            except Exception as e:
                print(e)
            return make_response("error", 404)

        # msg = json.loads(message)
        # print(msg)

        for item in WS_LIST:
            res = json.dumps({'data': count})
            item.send(res)


if __name__ == '__main__':
    def foo():
        global count
        while True:
            time.sleep(1)
            count += 1
            print(count)


    t1 = Thread(target=foo)  # 创建线程对象
    t1.start()  # 启动线程

    server = pywsgi.WSGIServer(('', 6000), app, handler_class=WebSocketHandler)
    print('server start http://localhost:6000')
    server.serve_forever()

templates/index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>text</title>
</head>
<body>
<input type="button" value="按钮" onclick="test()"/>
<div id="one"></div>
<script>
    function test() {
        let url = "ws://localhost:6000/main"
        let ws = new WebSocket(url);
        ws.onmessage = function (event) {
            document.getElementById('one').innerHTML = event.data;
            setTimeout(function () {
                ws.send(JSON.stringify({'hello':'world'}));
            }, 1000)

        };
        ws.onopen = function (evt) {
            console.log("Websocket open success", url);
            ws.send(JSON.stringify({'hello':'world'}));
        };
        ws.onclose = function (evt) {
        console.log("Connection closed.", evt);
        ws.close();
    };
    }

</script>
</body>
</html>

基于falsk的广播,打开多少个客户端都没问题
Flask==1.1.1
Flask-Sockets ==0.2.1
gevent==21.8.0
gevent-websocket==0.10.1


class SimpleEcho(WebSocket): 

    def handleMessage(self): 
     if self.data is None: 
      self.data = '' 

     for client in self.server.connections.itervalues(): 
      client.sendMessage(str(self.address[0]) + ' - ' + str(self.data)) 

     #echo message back to client 
     #self.sendMessage(str(self.data)) 

    def handleConnected(self): 
     print self.address, 'connected' 

    def handleClose(self): 
     print self.address, 'closed' 

https://blog.csdn.net/weixin_33453301/article/details/114397460?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-6.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-6.pc_feed_download_top3ask