首页 > 解决方案 > Flask socket IO - socket.on 方法中的发送和返回有什么区别

问题描述

我正在从反应级别使用 socketIO 从烧瓶中获取数据:

from flask import Flask
from flask_socketio import SocketIO, emit, send
from flask_cors import CORS
import datetime
    
app = Flask(__name__)
CORS(app) 
socketio = SocketIO(app, cors_allowed_origins="*") # mayby too much CORS handling...

@socketio.on('time')
def time():
    current_time = datetime.datetime.now().strftime("%H:%M:%S")
    return current_time

if __name__ == '__main__':
socketio.run(app)

在 Flask 中它工作正常,但是如果我切换到send(current_time)而不是我在 React 中得到未定义的值,那么在这种情况下和return current_time有什么区别?return()send()

import React, { useState, useEffect } from "react";
import socketIOClient from "socket.io-client";
const ENDPOINT = "http://127.0.0.1:5000";

    
function SubscribeToTimer() {
  const [response, setResponse] = useState(1);

  useEffect(() => {
      const socket = socketIOClient(ENDPOINT);
      
      socket.emit('time', function (data) {
          console.log('time: ', data);
          setResponse(data);
        })
  },[]);

  return (
    <div>
        <p>It's {response}</p>       
    </div>
  );
}

export default SubscribeToTimer;

标签: reactjsflasksocket.ioflask-socketio

解决方案


Python 中 Socket.IO 端点的返回值作为 ACK 数据包(如确认)发送回客户端。emit()JavaScript 客户端通过在发起所有内容的完成回调中传递值来使应用程序可以访问此值:

socket.emit('time', function(data) {
    // data is what the Python event handler returns
});

当服务器调用该send()函数时,它会向客户端发出一个message事件,与客户端向服务器发出的原始事件无关。要从send()调用中获取数据,客户端需要为事件实现事件处理程序message

socket.emit('time');
socket.on('message', function(data) {
    // data is what the Python side passes in the send() call
});

推荐阅读