809协议nodejs编写笔记(还在更新)

一、总体流程

  1. 数据首先通过receiver接受层接收,去掉标识头和标识尾;
  2. 再进入depacker解包层进行解包,把标识头分解出来并解析;
  3. 之后发给handler处理层根据不同的消息id选择使用不同的业务逻辑;
  4. 如果有应答,则通过sender发送层发送到socket上

二、业务流程及问题

1.链路登录流程

注意点:

  • 上级平台和下级平台各有一个服务器,且要连接一个对方的服务器,这样就能构成两条链路。
  • 登录的消息体需要给用户名,密码,端口号和ip,如果是2019版的还需要接入码。
  • 登陆应答以及从链路连接请求需要给一个校验码,这里的校验码不是循环冗余校验码的那个校验码,是随机一个数,下级平台保证收到的两个校验码一致才会应答从链路连接。

nodejs代码遇到的问题及解决方式:

Q1:作为下级平台需要一直发送登录请求,直到连接上主链路服务器为止。但是一旦连接不上就会报错终止程序。

解决办法:

法一:

socket.on('error',()=>{在这里面进行重连,就不会报错出去})

法二:

process.on('uncaughtException',()=>{在这里面进行重连})        
//    uncaughtException,报错进这里就不会中断程序

Q2:作为上级平台需要进行安全验证

解决办法:

仔细看协议,安全验证主要就是用户名,密码,ip和端口号还有接入码的验证

2.业务处理

Q1:到底是gbk还是utf8

解决办法:

有的地方上写着用gbk有的地方没写,没写的时候就要注意这个字段是否有中文存在的可能,比如车牌号肯定有中文,只要有中文一律使用gbk编码,在协议的数据类型介绍里面有详细描述(但我第一次看的时候完全忽视)

3.多个下级/上级的情况处理

Q1:如果有多个平台与本平台进行连接,我们需要很多个服务,但手动起并不现实

解决办法:

通过一个mian文件创建多个子进程,子进程的配置信息放在一个config.js的文件里,从数据库调用查找(里面有密钥,接入码,密码,用户名等)

const { fork } = require('child_process');
const {logger} = require('./utils/logger')
let cg = require('./config')
const runningProcesses = []function startProcess(temp){    // 启动子进程if(temp.amSuperiorPlatform===1){const childProcess = fork('上级文件路径', [temp.id, temp.treatyType, temp.mainLinkPort])childProcess.on('close',(code)=>{logger.info(temp.forwardingName+'子进程已关闭,code为:'+code)const index = runningProcesses.indexOf(childProcess);if(index!==-1){runningProcesses.splice(index,1)}})runningProcesses.push(childProcess);}else{const childProcess = fork('下级文件路径', [temp.id, temp.treatyType, temp.mainLinkPort, temp.subordinateLinkPort])childProcess.on('close',(code)=>{logger.info(temp.forwardingName+'子进程已关闭,code为:'+code)const index = runningProcesses.indexOf(childProcess);if(index!==-1){runningProcesses.splice(index,1)}})runningProcesses.push(childProcess);}}function stopProcess(index) {       // 关闭子程序if (runningProcesses[index]) {console.log(`停止子进程 `);runningProcesses[index].kill();}}function updateProcesses(processes){processes.forEach((temp,index)=>{if (temp.enable) {if (!runningProcesses[index]) {console.log(`启动子进程 `);startProcess(temp);}} else {stopProcess(index);}})
}async function main(){let temp = await cg.getConfig(-1)// 启动定时器,每隔一段时间更新子进程状态const updateInterval = 5000; // 5秒setInterval(()=>{updateProcesses(temp)}, updateInterval);}
main()

Q2:当启用多个进程的时候可能会调用同一个js组件文件,如果每个进程都要对此文件的变量进行修改,会不会影响并行的进程?

答案:不会,不同进程互不干扰,地址不同

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陪诊小程序开发|陪诊陪护小程序让看病不再难

陪诊小程序通过与医疗机构的合作,整合了医疗资源,让用户能够更加方便地获得专业医疗服务。用户不再需要面对繁琐的挂号排队,只需通过小程序预约服务,便能够享受到合适的医疗资源。这使得用户的就医过程变得简单高效,并…

CSS中的position属性有哪些值,并分别描述它们的作用。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ static⭐ relative⭐ absolute⭐ fixed⭐ sticky⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那…

Tomcat多实例部署及nginx+tomcat的负载均衡和动静分离

Tomcat多实例部署 安装 jdk、tomcat(流程可看之前博客) 配置 tomcat 环境变量 [rootlocalhost ~]# vim /etc/profile.d/tomcat.sh#tomcat1 export CATALINA_HOME1/usr/local/tomcat/tomcat1 export CATALINA_BASE1/usr/local/tomcat/tomcat1 export T…

pdf怎么转换成jpg图片?这几个转换方法了解一下

pdf怎么转换成jpg图片?转换PDF文件为JPG图片格式在现代工作中是非常常见的需求,比如将PDF文件中的图表、表格或者图片转换为JPG格式后使用在PPT演示、网页设计等场景中。 【迅捷PDF转换器】是一款非常实用的工具,可以将PDF文件转换成多种不同…

HTML详解连载(5)

HTML详解连载(5) 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽行高:设置多行文本的间距属性名属性值行高的测量方法 行高-垂直居中技巧 字体族属性名属性值示例扩展 font 复合属性使用场景复合属性示例注意 文本缩进属性…

YOLO v8目标跟踪详细解读(二)

上一篇,结合代码,我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解,下面我们将对跟踪中出现的卡尔曼滤波进行解读。 1.卡尔曼滤波器介绍 卡尔曼滤波(kalman Filtering)是一种利用线性…

Python学习 -- 常用函数与实例详解

在Python编程中,数据转换是一项关键任务,它允许我们在不同数据类型之间自由流动,从而提高代码的灵活性和效率。本篇博客将深入探讨常用的数据转换函数,并通过实际案例为你展示如何巧妙地在不同数据类型之间转换。 数据类型转换函…

分布式监控平台——Zabbix

市场上常用的监控软件: 传统运维:zabbix、 Nagios 一、zabbix概述 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监…

【数学建模】--因子分析模型

因子分析有斯皮尔曼在1904年首次提出,其在某种程度上可以被看成时主成分分析的推广和扩展。 因子分析法通过研究变量间的相关稀疏矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,由于归结出的因子个数少于原始变量的个数&#xff0c…

【第三讲-三维空间刚体运动】

旋转矩阵 点、向量、坐标系 坐标系分为左左手系和右手系 下面讨论有关向量的运算: 内积 外积: 外积的结果是一个向量,方向垂直于这两个向量,大小为

sift-1M数据集的读取及ES插入数据

sift是检查ann近邻召回率的标准数据集,ann可以选择faiss,milvus等库或者方法;sift数据分为query和base,以及label(groundtruth)数据。本文采用sift-1M进行解读,且看如下: 1、sift-1m数据集 官方链接地址:Evaluation of Approximate nearest neighbors: large datase…

brew+nginx配置静态文件服务器

背景 一下子闲下来了,了解的我的人都知道我闲不下来。于是,我在思考COS之后,决定自己整一个本地的OSS,实现静态文件的访问。那么,首屈一指的就是我很熟的nginx。也算是个小复习吧,复习一下nginx代理静态文…

通过网关访问微服务,一次正常,一次不正常 (nacos配置的永久实例却未启动导致)

微服务直接访问没问题,通过网关访问,就一次正常访问,一次401错误,交替正常和出错 负载均衡试了 路由配置检查了 最后发现nacos下竟然有2个order服务实例,我明明只开启了一个呀 原来之前的8080端口微服务还残留&…

spring按条件注入@Condition及springboot对其的扩展

概述 spring的ioc极大的方便了日常开发,但随着业务的迭代。配置的一些参数在某些情况下需要按条件注入。 比如原先定义的db公共模块下,相关的配置和工具类只是基于mysql的。但是后续有模块需要使用mongo/es等其他数据库,又想继续使用db公共…

基于ipad协议的gewe框架进行微信群组管理(二)

友情链接 geweapi.com 点击访问即可。 获取群组详情 小提示: 该接口可以一次查询20个群组查询出来的信息是不带公告的 请求URL: http://域名地址/api/group/detail 请求方式: POST 请求头: Content-Type:applica…

HTTP和HTTPS协议

目录 一、HTTP和HTTPS区别🌻 二、有了https还有使用http场景吗🍊 三、https协议的工作原理💥 四、https协议的优点和缺点🍞 一、HTTP和HTTPS区别🌻 HTTP(Hypertext Transfer Protocol)和HTT…

Android AOSP源码编译——AOSP整编(二)

切换到源码目录下执行下面命令 1、初始化环境 . build/envsetup.sh //清除缓存 make clobber2、选择编译目标 lunchAOSP 预制了很多 Product。这里为了简单我们先不用真机,而是选择模拟器的方式,对于 x86_64 模拟器,我们选择的是 aosp_x86…

3.1 Qt样式选择器

本期内容 3.1 样式选择器 3.1.1 Universal Selector (通用选择器) 3.1.2 Type Selector (类型选择器) 3.1.3 Property Selector (属性选择器) 3.1.4 Class Selector (类选择器) 3.1.5 ID Selector (ID选择器) 3.1.6 Descendant Selector (后裔选择器) 3.1.7 Chil…

微信小程序data-item设置获取不到数据的问题

微信小程序data-item设置获取不到数据的问题 简单说明: 在微信小程序中,通过列表渲染使用wx:for根据数组中的每一项重复渲染组件。同时使用bindtap给每一项绑定点击事件clickItem,再通过data-item绑定数据。 **问题:**通过data-i…

windows程序基础

一、windows程序基础 1. Windows程序的特点 1)用户界面统一、友好 2)支持多任务:允许用户同时运行多个应用程序(窗口) 3)独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#…