javascript - Flask-SocketIO 广播到客户端
问题描述
我在 Flask 文档(https://flask-socketio.readthedocs.io/en/latest/#broadcasting)中读到,向客户端发送消息可以由源自服务器的事件触发。所以我决定尝试一下。这个想法是客户端每秒向服务器发送 15 号,而无论客户端在做什么,服务器每两秒向客户端发送 12 号。
服务器端(.py):
from flask import Flask, jsonify, request, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__, static_folder='')
io = SocketIO(app, cors_allowed_origins="*")
@io.on('connected')
def connected():
print("client connected")
@io.on('messageC')
def messageC(data):
print(data)
def send_messageS():
io.emit('messageS', 12)
if __name__ == '__main__':
import _thread, time
_thread.start_new_thread(lambda: io.run(app), ())
while True:
time.sleep(2)
send_messageS()
客户端(.html):
<html>
<body>
<script type="text/javascript" src="//code.jquery.com/jquery-2.1.3.min.js"></script>
<script type="text/javascript" src="/resources/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function(){
var socket = io.connect('http://localhost:5000');
socket.on('connect', function() {
socket.emit('connected');
});
socket.on('messageS', function(data) {
console.log(data);
});
setInterval(function() {
socket.emit('messageC', 15);
},1000);
});
</script>
</body>
结果是服务器每秒接收到数字 15 是需要的,但客户端永远不会接收到数字 12。
我究竟做错了什么?
解决方案
我找到了解决方案。显然 eventlet 不适用于 Python 线程。因此解决方案是“对 Python 标准库进行猴子补丁,以便将线程、套接字等替换为对 eventlet 友好的版本”。
import eventlet
eventlet.monkey_patch()
这对我有用。我在这里找到了这个解决方案: How to send message from server to client using Flask-Socket IO
推荐阅读
- zend-framework3 - ZF3 路由语言环境参数
- angular - Ngbootstrap 不显示模态窗口
- python - 无法从字典python中提取值
- react-native - 对选项卡反应本机路由器通量身份验证流程,如在未授权的情况下显示帐户选项卡和在授权的情况下显示配置文件选项卡
- ios - Swift Core Data 多对多关系处理,codegen 为 Manual/None
- reactjs - React.JS:ReferenceError:未定义要求
- node.js - 带有用于 nodejs 的 mongodb 驱动程序的空集合
- c - C中的数组String和普通数组有什么区别?
- php - WordPress:在 Ajax 分页模板中添加时,关注用户按钮不起作用?
- algorithmic-trading - 如何替换 pine 脚本中的顺序?