套接字 io 仅在最后接收消息
Posted
技术标签:
【中文标题】套接字 io 仅在最后接收消息【英文标题】:socket io receive message only at the end 【发布时间】:2021-06-30 08:44:01 【问题描述】:我想将视频从烧瓶服务器流式传输到网页。出于测试目的,我只发送文本字符串。问题是客户最后只收到包裹。我必须等待 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;
【问题讨论】:
【参考方案1】:您是否使用 ASGI Web 服务器来托管此应用程序,可能是 eventlet?
您的主循环一直占用资源,socketio
没有时间通过 websocket 发送数据 - 这就是您最后收到所有消息的原因。简单time.sleep
不要发布。
尝试将time.sleep(1)
替换为socketio.sleep(0)
。
【讨论】:
以上是关于套接字 io 仅在最后接收消息的主要内容,如果未能解决你的问题,请参考以下文章
无法在所有客户端 angular/nestjs 套接字 io 中接收数据
套接字 IO 日志记录:在 Swift/iOS 中得到消息 3