SocketIO以突发方式而不是连续地传输数据

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

[我有一个程序,其中后端是用Python编写的,前端是用React/Electron编写的,并且我使用websocket,尤其是Socket.IO在两者之间进行通信(我在后端中使用Flask-SocketIO)。

我想每秒几秒钟连续传输少量数据(我的目标是每秒十次),但是在浏览器的接收端,数据进入了奇怪的突发:

data                        length      time
42["TRANSFER_DATA",250]     35          18:13:42.253
42["TRANSFER_DATA",253]     35          18:13:42.255
42["TRANSFER_DATA",259]     35          18:13:42.258
42["TRANSFER_DATA",265]     35          18:13:42.553
42["TRANSFER_DATA",270]     35          18:13:42.556
42["TRANSFER_DATA",276]     35          18:13:42.557
42["TRANSFER_DATA",281]     35          18:13:42.854
42["TRANSFER_DATA",287]     35          18:13:42.855
42["TRANSFER_DATA",292]     35          18:13:42.857
42["TRANSFER_DATA",298]     35          18:13:43.156
42["TRANSFER_DATA",303]     35          18:13:43.157
42["TRANSFER_DATA",309]     35          18:13:43.160

摘自开发工具日志

您可以看到,它们不是连续(每100ms)进入,而是每300ms出现3次突发。我已经测试了后端是否冻结,并且可以确认不是,问题可能出在Socket.IO本身中。]

非常简化

后端代码:
app = Flask(__name__)
sio = SocketIO(app, cors_allowed_origins="*")

def send_single(data, event_name, jsonify=False):
    if jsonify:
        data = json.dumps(data)
    sio.emit(event_name, data, json=jsonify)

def main_loop():
    while True: # This code is really simplified I don't actually do while True loops in the code itself
        data = get_this_data_from_somewhere()
        send_single(data, "TRANSFER_DATA")
        time.sleep(0.1)

if __name__ == '__main__':
    thread = threading.Thread(target=main_loop)
    thread.start()
    sio.run(app, host='127.0.0.1', port=58989)

非常简化

前端代码:
import React, {Component} from 'react';
import io from 'socket.io-client'

const socketURL = "http://127.0.0.1:58989";

class App extends Component {
    state = {value: 0};
    async initSocket(){
        const socket = io(socketURL);
        this.setState({socket});
        await socket.on('connect', async () => {
            console.log("SocketIO connection established");
        });
    };

    setupListeners = () => {
        this.state.socket.on('TRANSFER_DATA', (data) => {
            this.setState({value: data});
        });
    };

    componentDidMount() {
        this.initSocket().then(this.setupListeners);
    }

    render() {
        return(
            <React.Fragment>
                <span>{this.state.value}</span>
            </React.Fragment>
        )
    }
}

export default App;

编辑:

我试图完全摆脱使用Flask来查看是否与Flask相关的问题,并且在切换到Geventpython-socketio之后,问题仍然存在。

我也做了一些SocketIO服务器的日志记录,它似乎以100ms的间隔正确发出了信号

2019-12-10 21:15:15,710  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:15,811  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:15,911  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,013  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,114  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,214  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,315  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,415  INFO     emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,516  INFO     emitting event "TRANSFER_DATA" to all [/]

[我有一个程序,其中后端是用Python编写的,前端是用React / Electron编写的,并且我使用websockets,特别是Socket.IO在两者之间进行通信(我在...中使用Flask-SocketIO,

javascript python reactjs socket.io flask-socketio
1个回答
0
投票

感谢@Miguel的回复,我意识到我忘了给标准库打猴子补丁了,而且似乎已经成功了!

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