如何合并Dash与UDP代码实现接收端口报文时动态更新Div内容
解决方法
核心问题有三个,对应调整即可:
- 你提供的「UDP监听代码」实际是TCP实现(使用了
SOCK_STREAM参数),和需求的UDP协议不符,需要先修正协议类型 app.run_server()和Socket监听都是阻塞操作,直接放在主线程会互相卡住,需要用多线程分离两个任务- 需要设置共享变量存储最新UDP报文,配合Dash的
dcc.Interval组件定时拉取数据更新前端
完整可运行代码
import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import socket import threading # 全局变量存储最新收到的UDP报文 latest_udp_msg = "暂无数据" # 可选:加线程锁避免并发读写问题 msg_lock = threading.Lock() # UDP配置 PORT = 4501 SERVER = socket.gethostbyname(socket.gethostname()) ADDR = (SERVER, PORT) FORMAT = 'utf-8' def udp_listener(): global latest_udp_msg # 修正为UDP协议 udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_server.bind(ADDR) print(f"UDP服务已启动,监听端口{PORT}") while True: # UDP不需要accept,直接接收数据 msg, addr = udp_server.recvfrom(1024) decoded_msg = msg.decode(FORMAT) print(f"收到来自{addr}的报文: {decoded_msg}") # 写入共享变量 with msg_lock: latest_udp_msg = decoded_msg # 启动UDP监听后台线程 udp_thread = threading.Thread(target=udp_listener, daemon=True) udp_thread.start() # Dash初始化 app = dash.Dash(__name__) app.layout = html.Div([ html.H6("Value:"), html.Br(), html.Div(id='my-output'), # 定时触发器,每500毫秒触发一次回调 dcc.Interval( id='interval-component', interval=500, n_intervals=0 ) ]) # 定时更新前端内容 @app.callback(Output('my-output', 'children'), Input('interval-component', 'n_intervals')) def update_output(n): with msg_lock: return latest_udp_msg if __name__ == '__main__': # 关闭重载避免端口占用,需要调试可以把debug设为True app.run_server(debug=False, use_reloader=False)
关键说明
- 后台线程设置
daemon=True,主程序退出时会自动销毁UDP监听线程,不会残留进程占用端口 dcc.Interval的interval参数可以根据你的实时性需求调整,单位是毫秒- 如果有多个线程同时读写共享变量,加线程锁可以避免数据异常
内容的提问来源于stack exchange,提问作者mark_20202020
相关产品推荐
相关产品推荐

