###### 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'