2

我正在创建一个 Flask-socketio 应用程序,我想在收到 OSC 消息时发送套接字,以便通过 socketio.js 将其接收到 Web 应用程序中

from flask import Flask, render_template, copy_current_request_context, current_app
from flask_socketio import SocketIO, emit, send
from OSC import OSCClient, OSCMessage, OSCServer
import time, threading

app = Flask(__name__)
socketio = SocketIO(app)
client = OSCClient()
client.connect( ("localhost", 62345))
receive_address = ('localhost', 62346) 
server = OSCServer(receive_address)



# simple callback functions

def answer_handler(addr, tags, stuff, source):

    with app.app_context():
        socketio.emit('tempo', 1)

# adding callback functions to listener
server.addMsgHandler("/puredata", answer_handler)

if __name__ == '__main__':

   #Start OSCServer in extra thread
    st = threading.Thread( target = server.serve_forever )
    st.daemon = True
    st.start()
    print('OSC server is started')
    socketio.run(app, host='0.0.0.0')

即使我没有收到错误消息,套接字也没有从 javascript 端接收,因为在另一个线程中调用了发出函数,并且与请求上下文存在冲突。

我根据其他一些stackoverflow票尝试了几件事:

socketio = SocketIO(app, async_mode='threading')

在处理函数之前添加这一行

@copy_current_request_context

或者在回调中重新创建一个 socketio 实例

def answer_handler(addr, tags, stuff, source):

    socketio_connection = SocketIO(app)
    with app.app_context():
        socketio_connection.emit('tempo', 1)

但是这些解决方案都不起作用,我需要将解决这个“上下文”问题集成到我的线程中。注意 :

socketio.emit('tempo', 1)

在这个线程中工作得很好,并在 javascript 部分中收到

4

0 回答 0