javascript - 套接字 io 仅在最后接收消息
问题描述
我想将视频从烧瓶服务器流式传输到网页。出于测试目的,我只发送文本字符串。问题是客户最后只收到包裹。我必须等待 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 Web 服务器来托管此应用程序,可能是 eventlet?
您的主循环一直占用资源并且socketio
没有时间通过 websocket 发送数据 - 这就是您最后收到所有消息的原因。简单time.sleep
的不要释放它。
尝试替换time.sleep(1)
为socketio.sleep(0)
.
推荐阅读
- javascript - fs.createWriteStream 在将数据写入文件时不使用背压,导致内存使用率高
- android - 对firebase文档或手动ID使用随机ID更好吗?
- javascript - 如何知道浏览器中使用了 ES 6?
- spreadjs - 向列表验证器添加空选项
- hadoop - 无法使用 Hadoop Web UI 在 HDFS 中打开/下载文件
- java - 如何使用代码找出 sparql 查询的类型?
- java - 为什么 String hashCode 没有大小限制?
- hibernate - 用于用户输入的 Hibernate Envers 自定义字段
- r - 将倒数计时器转换为可用格式
- c++ - 使用 QRegularExpression 将嵌套捕获组与量词匹配