如何使用 python 从套接字客户端 return Flask 服务器端的 json 对象?

How to return the json object in the flask server side from socket client using python?

在我的客户端,我有dataJson,我想通过socketio 将其发送到服务器。在服务器端,我希望在 app.route 下接收并返回此 dataJson,以便在网络中显示它。

服务器端代码:

from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__)
app.config['SECRET_KEY'] = 'vnkdjnfjknfl1232#'
socketio = SocketIO(app)

@app.route('/')
def sessions():
    print(dataJson)
    return dataJson

@socketio.on('my event')
def handle_my_custom_event(json):
    global dataJson
    dataJson = json
    print('received json: ' + str(json))

if __name__ == '__main__':
   socketio.run(app, debug=True, host='127.0.0.1')

客户端代码:

from socketIO_client import SocketIO

import json
dataJson = {'xxx': 'yyy'}
with SocketIO('localhost', 5000) as socketIO:
    json = json.dumps(dataJson)
    socketIO.emit(json)
    print(json)

或者有其他方法可以达到我的目的吗? 谢谢!

我解决了这个问题。

Code on the server side
from flask import Flask, render_template
from flask_socketio import SocketIO
import json
app = Flask(__name__)
app.config['SECRET_KEY'] = 'vnkdjnfjknfl1232#'
socketio = SocketIO(app)

dataJson = None

@socketio.on('my event')
def handle_my_custom_event(json):
    global dataJson
    dataJson = json
    print('received json: ' + str(json))

@socketio.on('my event')
def handle_my_custom_event(json):
    global dataJson
    dataJson = json
    print('received json: ' + str(json))

@app.route('/')
def sessions():
    global  dataJson
    print(dataJson)
    print(type(dataJson))
    Data = dataJson.decode('utf-8')
    JsonData = json.loads(Data)
    print(JsonData)
    print(type(JsonData))

    return JsonData

if __name__ == '__main__':
   socketio.run(app, debug=True, host='127.0.0.1')

客户端代码

import json
import socketio



sio = socketio.Client()

def send_ping():
    while True:
      x = 1
      x=x+1
      jsonData = {'aaa': x}
      Data = json.dumps(jsonData).encode('utf-8')
      print(type(Data))
      sio.emit('my event', Data)

@sio.event

def connect():

    print('connected to server')

    send_ping()

if __name__ == '__main__':

    sio.connect('http://localhost:5000')

不确定这是否是您的代码的唯一问题,但客户端 emit 调用缺少事件名称。它应该是这样的:

socketIO.emit('my event', json)

另请注意,您正在使用一个名为 json 的变量,它将隐藏 json 包。将其更改为不同的名称以避免难以捕获的错误。

最后,我可能想建议您使用 python-socketio 包中的 Socket.IO 客户端,而不是您正在使用的客户端。 python-socketio 包包括一个服务器和一个客户端。服务器是您作为 Flask-SocketIO 扩展的一部分使用的,因此您将使用由同一个人(即我,所以我有偏见)编写的服务器和客户端。