解决仪器掉线备忘

网络管控越来越严格,老的Mac模式连接的仪器经常断开,要么是网络没活动被断开TCP了,要么是网络波动无法保持TCP。每次重启仪器控制很麻烦,基于之前用M写http服务的基础上改进仪器接口连接。
参照之前实现http服务的逻辑

最终逻辑

///要实现客户端断线重连就拷贝此方法到仪器接口,仪器主处理函数约定为Main,Main异常记得给ShouldQClient变量设置1或者不捕获异常
///主侦听函数,有线程处理客户端请求,循环判断客户端连入
///启动主侦听
///d ListenMian^MI.MIF000(mi,"Start")
ListenMian(mi,startFunName)  s IP=$li(^dbo.BTMIMachineParameterD(mi),9)s Port=$li(^dbo.BTMIMachineParameterD(mi),10)//数据库是服务端i '$l(IP) d.//检查停止标志.i $$Stop^MI.MIF000(mi) q.u Device READ x   .u 0.u Device .//用子线程处理客户端请求.//j DealClient:(:17::) .d Trace^MI.MIF000(mi,"新客户端连入本TCP服务","LISSYS").d DealClient(mi).//检查停止标志.i $$Stop^MI.MIF000(mi) q.c Device.//GOTO做成循环 .d ListenMian(mi,startFunName)e  d.s IFProgram=$lg($g(^dbo.BTMIMachineParameterD(mi)),16).s MainStr="d Main^"_IFProgram.s ShouldQClient=0.//循环执行Main方法,直到表标识要退出或者标识变量要退出.f  d ..//捕获错误,防止Main没捕获错误异常退出了..SET $ZTRAP="ErrHandleClient",$ECODE=""  //捕获错误开始 ..x MainStr ..i $$Stop^MI.MIF000(mi)||(ShouldQClient=1) breakq///当客户端发生错误捕获    
ErrHandleClient SET $ZTRAP=""h 1s ErrCode=$ECODEd Trace^MI.MIF000(mi,$TR($ZERROR,"^","--")_".错误代码:"_ErrCode,"当客户端运行")//串口不能读了就重连i ErrCode["READ" d .d Trace^MI.MIF000(mi,"TCP重连中","尝试重连").d ReconnectServer//其他的异常还是退出e  s ShouldQClient=1q 1 ///客户端重连方法实现 
ReconnectServer//检查停止标志i $$Stop^MI.MIF000(mi) qc Portc Deviceh 1l -^MILOCK(mi)d Trace^MI.MIF000(mi,"移除锁","新起动TCP")s StartStr="(startRet) s startRet=$$"_startFunName_"^MI.MIF000("_mi_")"d Trace^MI.MIF000(mi,StartStr,"新起动TCP调用")s startRet=""x (StartStr,.startRet)d Trace^MI.MIF000(mi,startRet,"新起动TCP返回")//重连失败又尝试这里启动方法和上面一致i startRet d ReconnectServerd Trace^MI.MIF000(mi,"成功启动","新起动TCP")q///要实现客户端断线重连就拷贝此方法到仪器接口,仪器主处理函数约定为Main,Main异常记得给ShouldQClient变量设置1    
///处理客户端请求  
DealClient(mi) //s Device=##class(%SYSTEM.INetInfo).TCPName()//客户端输入的数据//s input=$PRINCIPAL//s output=$IO//s record=""//u Device:(::"M") //标识是否结束客户端处理 s IFProgram=$lg($g(^dbo.BTMIMachineParameterD(mi)),16)s ShouldQClient=0s MainStr="d Main^"_IFProgramd Trace^MI.MIF000(mi,"循环执行:"_MainStr,"LISSYS")//循环执行Main方法,直到表标识要退出或者标识变量要退出f  d  .//捕获错误,防止Main没捕获错误异常退出了.SET $ZTRAP="ErrHandleServer",$ECODE=""  //捕获错误开始.x MainStr .i $$Stop^MI.MIF000(mi)||(ShouldQClient=1) breakq///当服务端发生错误捕获    
ErrHandleServer SET $ZTRAP=""h 1s ShouldQClient=1d Trace^MI.MIF000(mi,$TR($ZERROR,"^","--")_".错误代码:"_$ECODE,"当服务端运行")q 1 

使用方式如下图
在这里插入图片描述

数据库当服务端原理
原理就是对Cache做服务端的接口,启动一个主侦听来侦听客户端的连接,由于是给仪器连接的所以把http服务实现的用进程处理客户端连接就不用进程了,因为仪器只有一个在用连接。仪器接口没出错时候主侦听堵塞处理不了新客户端连接也无所谓,仪器处理异常后代码又退回到主侦听,就能处理新的客户端连入。

数据库当客户端原理
数据库当客户端时候连别人的TCP服务,如果异常了就会进入异常捕获,这时候调用重连逻辑就能重新起来TCP连接,重连不一定成功,这时候就进入一直重连的死循环,直到成功。重Start之前先关闭之前端口和设备。重连成功后就会跳出重连的死循环继续回到Main的执行上。

此方案不用动连接模式,只要改一行接口代码就能支持断开重连,解决麻烦的仪器掉线问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147360.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何解决版本不兼容Jar包冲突问题

如何解决版本不兼容Jar包冲突问题 引言 “老婆”和“妈妈”同时掉进水里,先救谁? 常言道:编码五分钟,解冲突两小时。作为Java开发来说,第一眼见到ClassNotFoundException、 NoSuchMethodException这些异常来说&…

VRRP配置案例(路由走向分析,端口切换)

以下配置图为例 PC1的配置 acsw下行为access口&#xff0c;上行为trunk口&#xff0c; 将g0/0/3划分到vlan100中 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname acsw [acsw] Sep 11 2023 18:15:48-08:00 acsw DS/4/DATASYNC_CFGCHANGE:O…

再次总结nios II 下载程序到板子上时出现 Downloading RLF Process failed的问题

之前也写过两篇关于NIOS II 出现&#xff1a;Downloading RLF Process failed的问题&#xff0c;但是总结都不是很全面&#xff0c;小梅哥的教程总结的比较全面特此记录。 问题&#xff1a;nios II 下载程序到板子上时出现 Downloading RLF Process failed的问题。 即当nios中…

《Jetpack Compose从入门到实战》 第二章 了解常用UI组件

目录 常用的基础组件文字组件图片组件按钮组件选择器组件对话框组件进度条组件 常用的布局组件布局Scaffold脚手架 列表 书附代码 Google的图标库 常用的基础组件 文字组件 Composable fun TestText() {Column(modifier Modifier.verticalScroll(state rememberScrollState…

Ubuntu20.04.1编译qt6.5.3版mysql驱动

下载qtbase6.5.3源码&#xff0c;将plugin中sqldrivers源码拷至于项目工程中&#xff0c;使用qtcreator打开文件 1、下载mysql开发库 sudo apt-get update sudo apt-get install build-essential libmysqlclient-dev 2、在msyql子目录中CMakeLists.txt第一行添加头文件、引…

浏览器指定DNS

edge--设置 https://dns.alidns.com/dns-query

前端页面初步开发

<template><div><el-card class"box-card" style"height: 620px"><el-input v-model"query.name" style"width:200px" placeholder"请输入用户姓名"></el-input>&nbsp&nbsp&nbsp…

yolov8 opencv模型部署(C++版)

yolov8 opencv模型部署&#xff08;C 版&#xff09; 使用opencv推理yolov8模型&#xff0c;仅依赖opencv&#xff0c;无需其他库&#xff0c;以yolov8s为例子&#xff0c;注意&#xff1a; 使用opencv4.8.0 &#xff01;使用opencv4.8.0 &#xff01;使用opencv4.8.0 &#…

有时候,使用 clang -g test.c 编译出可执行文件后,发现 gdb a.out 进行调试无法读取符号信息,为什么?

经过测试&#xff0c;gdb 并不是和所有版本的 llvm/clang 都兼容的 当 gdb 版本为 9.2 时&#xff0c;能支持 9.0.1-12 版本的 clang&#xff0c;但无法支持 16.0.6 版本的 clang 可以尝试使用 LLVM 专用的调试器 lldb 我尝试使用了 16.0.6 版本的 lldb 调试 16.0.6 的 clan…

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类&#xff1f; 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…

Multiple CORS header ‘Access-Control-Allow-Origin‘ not allowed

今天在修改天天生鲜超市项目的时候&#xff0c;因为使用了前后端分离模式&#xff0c;前端通过网关统一转发请求到后端服务&#xff0c;但是第一次使用就遇到了问题&#xff0c;比如跨域问题&#xff1a; 但是&#xff0c;其实网关里是有配置跨域的&#xff0c;只是忘了把前端项…

画CMB天图使用Planck配色方案

使用Planck的配色方案&#xff1a; 全天图&#xff1a; 或者方形图&#xff1a; 使用下面设置即可&#xff1a; import pspy, pixell from pspy.so_config import DEFAULT_DATA_DIR pixell.colorize.mpl_setdefault("planck")此方法不会改变matplotlib默认配色方案…

虚拟机安装 centos

title: 虚拟机安装 centos createTime: 2020-12-13 12:00:27 updateTime: 2020-12-13 12:00:27 categories: linux tags: 虚拟机安装 centos 路线图 主机(宿主机) —> centos --> docker --> docker 镜像 --> docker 容器 — docker 服务 1.前期准备 一台 主机 或…

分类预测 | Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测

分类预测 | Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测&#xff0…

TensorFlow入门(一、环境搭建)

一、下载安装Anaconda 下载地址:http://www.anaconda.comhttp://www.anaconda.com 下载完成后运行exe进行安装 二、下载cuda 下载地址:http://developer.nvidia.com/cuda-downloadshttp://developer.nvidia.com/cuda-downloads 下载完成后运行exe进行安装 安装后winR cmd进…

JAVA面经整理(5)

创建线程池不是说现用先创建&#xff0c;而是要是可以复用线程池中的线程&#xff0c;就很好地避免了大量用户态和内核态的交互&#xff0c;不需要频繁的创建和销毁线程 一)什么是池化技术&#xff1f;什么是线程池&#xff1f; 1)池化技术是提前准备好一些资源&#xff0c;在…

[React] 性能优化相关 (一)

文章目录 1.React.memo2.useMemo3.useCallback4.useTransition5.useDeferredValue 1.React.memo 当父组件被重新渲染的时候&#xff0c;也会触发子组件的重新渲染&#xff0c;这样就多出了无意义的性能开销。如果子组件的状态没有发生变化&#xff0c;则子组件是不需要被重新渲…

华为智能企业上网行为管理安全解决方案(1)

华为智能企业上网行为管理安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业上网行为概述企业上网行为安全风险分析企业上网行为管理需求分析 方案设计组网架构设备选型设备简介行为管理要点分析方案功能概述 课程地址 本方案相关课程资源已在华为O3社区发…

网络协议--概述

1.2 分层 网络协议通常分不同层次进行开发&#xff0c;每一层分别负责不同的通信功能。一个协议族&#xff0c;比如TCP/IP&#xff0c;是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统&#xff0c;如图1-1所示。 每一层负责不同的功能&#xff1a; 1.…

C++(string类)

本节目标&#xff1a; 1、为什么要学习string类 2.标准库中的string类 3.vs和g下string结构说明 1.为什么学习string类 1.1 c语言中的字符串 C 语言中&#xff0c;字符串是以 \0 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c; C 标准库中提供了一些 str系列的…