使用 Flask Socket Io 和 Reactjs 进行连续数据传输
Continuous Data Transfer with Flask Socket Io and Reactjs
我试图每秒从我的服务器向前端传输数据。目前我只能连接到 socket io
,我找到的所有教程都以聊天应用程序为例。
该项目由 pymodbus
组成,因此我可以与 plc
通信并收集这些数据。然后使用 reactjs
可视化数据
Python
from flask import Flask, jsonify
from flask_restful import Api, Resource
from flask_socketio import SocketIO, emit
import random
app = Flask(__name__)
app.config["SECRET_KEY"] = "somethingRandom"
app.config["DEBUG"] = True
api = Api(app)
socketio = SocketIO(app, cors_allowed_origins="*")
@app.route("/")
def hello_world():
return jsonify(mssg="hello world")
def PlcTankData():
i = 5
j = 0
while j != 5: # should be while True
j+=1
sample = random.randint(1, 10)
print(sample)
emit("newdata", {"td": sample}, namespace="/home")
socketio.sleep(1)
@socketio.on("connect", namespace="/home")
def frontend_connection():
print("Client is Connected")
emit("connect", {"hello": "world"})
PlcTankData()
class MachineStatus(Resource):
def put(self):
data = request.json
print(data)
api.add_resource(MachineStatus, '/machine-stat')
if __name__ == '__main__':
socketio.run(app, host="192.168.0.105", port=5000)
Reactjs
import React, { useState, useEffect } from 'react'
import axios from 'axios'
import io from 'socket.io-client'
//To Control the machcine
const handleMachineStatus = async (e) => {
await axios
.put('http://192.168.0.105:5000/machine-status', { status: e.target.name })
.then((res) => {
console.log(res)
})
.catch((err) => console.log(err))
}
//To get real time data
useEffect(() => {
const socket = io.connect('http://192.168.0.105:5000/home')
socket.on('connect', (data) => console.log(data))
socket.on('newdata', (data) => console.log(data))
}, [])
我知道 while 循环是造成问题的原因,因为在 while 循环完成后数据被抛出。
PS: 不知道是不是react代码也有问题所以打上标签
connect
处理程序不是 运行 冗长任务的好地方,因为一旦您从该处理程序 return Flask-SocketIO 就会完成连接过程。
我建议您将 PlcTankData
函数移动到一个单独的事件中,而不是从 connect
处理程序中调用它。
我试图每秒从我的服务器向前端传输数据。目前我只能连接到 socket io
,我找到的所有教程都以聊天应用程序为例。
该项目由 pymodbus
组成,因此我可以与 plc
通信并收集这些数据。然后使用 reactjs
Python
from flask import Flask, jsonify
from flask_restful import Api, Resource
from flask_socketio import SocketIO, emit
import random
app = Flask(__name__)
app.config["SECRET_KEY"] = "somethingRandom"
app.config["DEBUG"] = True
api = Api(app)
socketio = SocketIO(app, cors_allowed_origins="*")
@app.route("/")
def hello_world():
return jsonify(mssg="hello world")
def PlcTankData():
i = 5
j = 0
while j != 5: # should be while True
j+=1
sample = random.randint(1, 10)
print(sample)
emit("newdata", {"td": sample}, namespace="/home")
socketio.sleep(1)
@socketio.on("connect", namespace="/home")
def frontend_connection():
print("Client is Connected")
emit("connect", {"hello": "world"})
PlcTankData()
class MachineStatus(Resource):
def put(self):
data = request.json
print(data)
api.add_resource(MachineStatus, '/machine-stat')
if __name__ == '__main__':
socketio.run(app, host="192.168.0.105", port=5000)
Reactjs
import React, { useState, useEffect } from 'react'
import axios from 'axios'
import io from 'socket.io-client'
//To Control the machcine
const handleMachineStatus = async (e) => {
await axios
.put('http://192.168.0.105:5000/machine-status', { status: e.target.name })
.then((res) => {
console.log(res)
})
.catch((err) => console.log(err))
}
//To get real time data
useEffect(() => {
const socket = io.connect('http://192.168.0.105:5000/home')
socket.on('connect', (data) => console.log(data))
socket.on('newdata', (data) => console.log(data))
}, [])
我知道 while 循环是造成问题的原因,因为在 while 循环完成后数据被抛出。
PS: 不知道是不是react代码也有问题所以打上标签
connect
处理程序不是 运行 冗长任务的好地方,因为一旦您从该处理程序 return Flask-SocketIO 就会完成连接过程。
我建议您将 PlcTankData
函数移动到一个单独的事件中,而不是从 connect
处理程序中调用它。