套接字 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 仅在最后接收消息的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 没有发送给所有客户端

无法在所有客户端 angular/nestjs 套接字 io 中接收数据

套接字 IO 日志记录:在 Swift/iOS 中得到消息 3

在 android 中使用套接字 io 进行身份验证以用于聊天应用程序

recv() 接收部分消息的套接字编程问题

套接字 - 接收/发送消息 (php)