按设定的时间间隔从flask_socketio服务器发送事件。

问题描述 投票:1回答:1

我有一个React客户端,它需要消耗一个由 flask_socketio 服务器,如果我在服务器上发送一条消息,就可以正常工作。'connect' 然而,如果我一直在while循环中发出它,客户端就不会接收到。我推测这可能是由于在一个活动的线程中执行了动作。我在网上找不到任何关于这个问题的帖子。

下面是我的React js客户端代码。

class MyClient extends Component {

    constructor() {
        super();
        this.state = {
            endpoint:"http://127.0.0.1:5000",
            response: ""
        };
    }


    componentDidMount() {
        console.log("test")
        const {endpoint} = this.state;
        //Very simply connect to the socket
        const socket = socketIOClient(endpoint);
        //Listen for data
        socket.on("connect", dd => {

            socket.on("log", dx => this.setState({response: dx.data}));

          });

    }


    render() {

        const {response} = this.state;

        return (
            <div>
            <h1>Test {response}</h1>
            {console.log(response)}>
        </div>

        )
    }



}

客户端寻找的是 "log" 当客户端加载时,我看到了数据,而当我断开连接并重新连接服务器时,我可以在客户端看到新的数据。我想知道我如何连续地发射数据。

from flask import Flask, render_template, request, jsonify
from flask_socketio import SocketIO, emit
from flask_cors import CORS
from datetime import datetime
import time

now = datetime.now()

current_time = now.strftime("%H:%M:%S")


app = Flask(__name__)
app.config['SECRET_KEY'] = 'justasecretkeythatishouldputhere'

socketio = SocketIO(app,cors_allowed_origins="*")
CORS(app)


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


@app.route('/api')
def api():
    query = dict(request.args)
    socketio.emit('log', dict(data=str(query)), broadcast=True)
    return jsonify(dict(success=True, message='Received'))


@socketio.on('connect')
def on_connect():
    time.sleep(1)
    t = str(time.clock())
    print(t)
    socketio.emit('log', {'data': t, 'time': t})


if __name__ == '__main__':
    socketio.run(app,port=5000)

下面的循环不工作,我应该把它作为一个后台线程运行,还是有一个async属性,我需要添加到socketio。任何帮助都是非常感激的。

@socketio.on('connect')
def on_connect():
    while True:
        time.sleep(1)
        t = str(time.clock())
        print(t)
        socketio.emit('log', {'data': t, 'time': t})
python reactjs flask socket.io flask-socketio
1个回答
1
投票

在你的客户端,你可以使用 setInterval 方法,每隔几毫秒发出一个事件。

在服务器端,你可以发出事件,通过它来发送数据。

所以,所有这些加在一起,就像下面这样。

客户端:

setInterval(function() {
    socket.emit('time');
}, 1) // 1 millisecond is almost close to continues

socket.on('time', function(data) {
    console.log(data)
});

服务器端:

@socket.on('time')
def time():
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")
    emit('time', current_time)

在浏览器的控制台日志中,你可以看到持续的数据被记录下来。

希望对大家有所帮助。

注意事项 客户端代码,我在这里提供的,是纯JavaScript的。因为,React是基于JavaScript的,所以会有一些或其他的方式来使用。setInterval.

© www.soinside.com 2019 - 2024. All rights reserved.