socket io 只在最后接收消息
socket io receive message only at the end
我想将视频从 Flask 服务器流式传输到网页。出于测试目的,我只发送文本字符串。问题是客户端只在最后收到包裹。我必须等待 30 秒,然后才能收到所有消息。当我使用无限循环进行流式传输时,客户端永远不会收到消息。
这是我的服务器代码:
from flask import Flask, render_template, request, jsonify
from flask_socketio import SocketIO, emit, send
from flask_cors import CORS
import cv2
import base64
import time
app = Flask(__name__)
app.config['SECRET_KEY'] = 'justasecretkeythatishouldputhere'
socketio = SocketIO(app, cors_allowed_origins="http://localhost:3000", logger=True, engineio_logger=True)
CORS(app)
@socketio.on('connect')
def on_connect(auth):
print("CONNECTED")
@socketio.on("live")
def live(test):
cap = cv2.VideoCapture(0)
counter = 0
for _ in range(30):
counter += 1
ret,frame = cap.read()
retval, buffer = cv2.imencode('.jpg', frame)
send(f"Hi, {counter}")
time.sleep(1)
if __name__ == '__main__':
socketio.run(app)
这是我的客户端代码:
import {useEffect, useState} from 'react'
import logo from './logo.svg';
import './App.css';
import { io } from "socket.io-client";
function App() {
const [test, setText] = useState("test")
useEffect(()=>{
const socket = io("http://localhost:5000");
console.log(socket)
socket.on('message', function (data) {
console.log(data)
setText(data)
});
socket.emit('live', "data");
},[])
return (
<div className="App">
{test}
</div>
);
}
export default App;
您是否使用 ASGI 网络服务器托管此应用程序,可能是 eventlet?
您的主循环一直占用资源,socketio
没有时间通过 websocket 发送数据 - 这就是您在最后收到所有消息的原因。简单time.sleep
不放
尝试将 time.sleep(1)
替换为 socketio.sleep(0)
。
我想将视频从 Flask 服务器流式传输到网页。出于测试目的,我只发送文本字符串。问题是客户端只在最后收到包裹。我必须等待 30 秒,然后才能收到所有消息。当我使用无限循环进行流式传输时,客户端永远不会收到消息。 这是我的服务器代码:
from flask import Flask, render_template, request, jsonify
from flask_socketio import SocketIO, emit, send
from flask_cors import CORS
import cv2
import base64
import time
app = Flask(__name__)
app.config['SECRET_KEY'] = 'justasecretkeythatishouldputhere'
socketio = SocketIO(app, cors_allowed_origins="http://localhost:3000", logger=True, engineio_logger=True)
CORS(app)
@socketio.on('connect')
def on_connect(auth):
print("CONNECTED")
@socketio.on("live")
def live(test):
cap = cv2.VideoCapture(0)
counter = 0
for _ in range(30):
counter += 1
ret,frame = cap.read()
retval, buffer = cv2.imencode('.jpg', frame)
send(f"Hi, {counter}")
time.sleep(1)
if __name__ == '__main__':
socketio.run(app)
这是我的客户端代码:
import {useEffect, useState} from 'react'
import logo from './logo.svg';
import './App.css';
import { io } from "socket.io-client";
function App() {
const [test, setText] = useState("test")
useEffect(()=>{
const socket = io("http://localhost:5000");
console.log(socket)
socket.on('message', function (data) {
console.log(data)
setText(data)
});
socket.emit('live', "data");
},[])
return (
<div className="App">
{test}
</div>
);
}
export default App;
您是否使用 ASGI 网络服务器托管此应用程序,可能是 eventlet?
您的主循环一直占用资源,socketio
没有时间通过 websocket 发送数据 - 这就是您在最后收到所有消息的原因。简单time.sleep
不放
尝试将 time.sleep(1)
替换为 socketio.sleep(0)
。