You need to enable JavaScript to run this app. 使用Flask SocketIO和Reactjs实现PLC数据持续每秒传输问题排查
优惠活动
大模型
产品
解决方案
定价
更多

使用Flask SocketIO和Reactjs实现PLC数据持续每秒传输问题排查

修复方案

后端修改点

核心问题是在connect事件回调中直接执行循环采集逻辑,阻塞了SocketIO的事件线程,导致消息无法实时发送。需要将采集逻辑放到独立的后台线程运行,同时修正缺失的导入:

from flask import Flask, jsonify, request # 补导入request
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():
  # 实际使用替换为while True
  j = 0
  while j != 5:
    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"})
  # 启动后台任务执行采集,不阻塞当前线程
  socketio.start_background_task(PlcTankData)

class MachineStatus(Resource):
  def put(self):
    data = request.json
    print(data)
    return {"code":0, "msg":"success"} # 加返回值避免接口报错

api.add_resource(MachineStatus, '/machine-stat')

if __name__ == '__main__':
  socketio.run(app, host="192.168.0.105", port=5000)

前端修改点

现有代码存在连接泄漏、接口地址不匹配的问题,修正如下:

import React, { useState, useEffect, useRef } from 'react'
import axios from 'axios'
import io from 'socket.io-client'

const YourComponent = () => {
  // 用useRef保存socket实例,避免重复创建
  const socketRef = useRef(null)

  // 控制设备函数
  const handleMachineStatus = async (e) => {
      await axios
        // 修正接口地址和后端保持一致
        .put('http://192.168.0.105:5000/machine-stat', { status: e.target.name })
        .then((res) => {
          console.log(res)
        })
        .catch((err) => console.log(err))
  }

  // 获取实时数据
  useEffect(() => {
      // 建立连接,指定websocket传输提升稳定性
      socketRef.current = io.connect('http://192.168.0.105:5000/home', {
        transports: ['websocket']
      })
      const socket = socketRef.current

      socket.on('connect', (data) => console.log('连接成功', data))
      socket.on('newdata', (data) => console.log('收到新数据', data))

      // 组件卸载时断开连接,避免泄漏
      return () => {
        socket.disconnect()
      }
  }, [])

  // 你的组件渲染逻辑
  return <div>可视化页面</div>
}

export default YourComponent

额外优化建议

  • 生产环境关闭DEBUG模式,限制cors_allowed_origins为前端实际域名,不要用通配符
  • 多客户端接入场景可以增加房间分组,避免重复生成推送数据,降低服务端负载
  • 增加PLC采集异常捕获逻辑,避免采集线程崩溃导致推送中断

内容的提问来源于stack exchange,提问作者user15368351

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 08:45:08