如何使用 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 扩展的一部分使用的,因此您将使用由同一个人(即我,所以我有偏见)编写的服务器和客户端。
在我的客户端,我有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 扩展的一部分使用的,因此您将使用由同一个人(即我,所以我有偏见)编写的服务器和客户端。