Javascript Python Flask emit()函数不向客户端发送实时数据

Javascript Python Flask emit()函数不向客户端发送实时数据,javascript,python,flask,websocket,flask-socketio,Javascript,Python,Flask,Websocket,Flask Socketio,我制作了一个倒计时计时器,并将emit函数放在for循环中。但emit不会将我的计时器数据发送到客户端 这是我的python服务器端代码: from flask import Flask,render_template,render_template_string from flask_socketio import SocketIO, emit app = Flask(__name__) app.config['SECRET KEY'] = 'random' socketio = Sock

我制作了一个倒计时计时器,并将emit函数放在for循环中。但emit不会将我的计时器数据发送到客户端

这是我的python服务器端代码:

from flask import Flask,render_template,render_template_string
from flask_socketio import SocketIO, emit

app = Flask(__name__) 
app.config['SECRET KEY'] = 'random'
socketio = SocketIO(app)

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

@socketio.on('test_timer')
def Timer(seconds=3600):
    def hms(seconds): # hour minute second function
        h = seconds // 3600
        m = seconds % 3600 // 60
        s = seconds % 3600 % 60
        return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

    for i in range(seconds):
        emit(hms(seconds-i),broadcast=True)
        emit.sleep(1)

if __name__ == '__main__':
    socketio.run(app,debug=True)
<!DOCTYPE html>

<html>
    <body>
        <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
        <script type="text/javascript" charset="utf-8">
            var socket = io().connect('http://127.0.0.1:5000');
            socket.on('test_timer', function(receiving_data) {
            console.log(receiving_data);
            });
        </script>
    </body>
</html>
这是我的客户端javascript代码:

from flask import Flask,render_template,render_template_string
from flask_socketio import SocketIO, emit

app = Flask(__name__) 
app.config['SECRET KEY'] = 'random'
socketio = SocketIO(app)

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

@socketio.on('test_timer')
def Timer(seconds=3600):
    def hms(seconds): # hour minute second function
        h = seconds // 3600
        m = seconds % 3600 // 60
        s = seconds % 3600 % 60
        return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

    for i in range(seconds):
        emit(hms(seconds-i),broadcast=True)
        emit.sleep(1)

if __name__ == '__main__':
    socketio.run(app,debug=True)
<!DOCTYPE html>

<html>
    <body>
        <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
        <script type="text/javascript" charset="utf-8">
            var socket = io().connect('http://127.0.0.1:5000');
            socket.on('test_timer', function(receiving_data) {
            console.log(receiving_data);
            });
        </script>
    </body>
</html>

var socket=io().connect('http://127.0.0.1:5000');
socket.on('test_timer',函数(接收_数据){
console.log(接收_数据);
});
即使我运行服务器,console.log也不会在客户端打印任何计时器数据。

以下几行显示了emit函数的

def emit(self,event,data=None,room=None,include_self=True,
命名空间=无,回调=无):
在Flask应用程序中,您有一个为
test\u timer
事件注册的处理程序。 在这个处理程序中,您需要发出一个响应事件,后跟
数据
,而不仅仅是
数据
。比如说,

@socketio.on('test_timer')
def Timer(seconds=3600):
    def hms(seconds): # hour minute second function
        h = seconds // 3600
        m = seconds % 3600 // 60
        s = seconds % 3600 % 60
        return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

    for i in range(seconds):
        emit('test_timer_reply', hms(seconds-i),broadcast=True)
        socketio.sleep(1)
在客户端代码中,您还需要发出
test\u timer
并为
test\u timer\u reply
注册侦听器

var socket = io().connect('http://127.0.0.1:5000');
socket.emit('test_timer')
socket.on('test_timer_reply', function(receiving_data) {
  console.log(receiving_data);
});

主要问题是,客户端从未向服务器发送
test\u timer
;你所做的只是在双方对该消息做出反应,但你永远不会在任何地方发出该消息。非常感谢,它可以成功地工作,但当一次发送数据时,for循环中断。如何防止这种情况发生?如果您的意思是@skipsbiepsit工作成功,请将其放入while True循环以继续发送,但当页面刷新时计时器将重新启动。为什么?我的广播选项是正确的