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.hqwc.cn/news/71221.html

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

相关文章

js 构造函数

js 构造函数 new Pig() ---- 创建新的空对象 this 指向新对象 this.name name --------修改this,添加新的属性。 最后返回新的对象

蓝牙、语音合二为一,启英泰伦CI231系列AI语音BLE芯片

随着智能家居的快速发展和人们对个性化体验的追求,近期启英泰伦推出了令人振奋的创新产品——CI231系列AI语音BLE芯片。这一系列芯片将语音与BLE技术巧妙融合,为用户提供了更丰富的设备连接选项和更个性化的语音交互体验。 CI231系列芯片实物图 CI231系…

【rust/egui】(二)看看template的main函数:日志输出以及eframe run_native

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 开始 首先让我们看看main.rs中有些什么…

使用Jmeter进行压力测试你所不知道内幕

在网络很多网友反馈Jmeter的测试结果不准确,下面我们主要聊一下不准确的原因。 Jmeter 是ASF的一款开源免费软件 ,在国内被很多中小公司当作性能测试工具广泛使用。Apache软件基金会(ASF)是一家总部位于美国的非营利性慈善组织。…

网络编程学习

网络编程 软件结构 C/S结构:QQ、迅雷、百度网盘 程序员:开发客户端和服务端程序用户:需要下载升级更新客户端对网络带宽要求相对较低数据安全性相对较高 B/S结构:IE、谷歌、火狐 程序员:只需要开发服务端程序用户&am…

ArcGIS Pro如何制作不规则形状图例

在默认的情况下,ArcGIS Pro生成的图例是标准的点、直线和矩形的,对于湖泊等要素而言,这样的表示方式不够直观,我们可以将其优化一下,制作不规则的线和面来代替原有图例,这里为大家介绍一下制作方法&#xf…

联想拯救者笔记本Win11系统键盘无法打字解决参考方法

一位好机友新购买的联想拯救者笔记本在使用过程中突然发现整个键盘都不能使用了、不能打字、按任何按键都没有反应,只有鼠标能正常操作;那么这是什么问题呢?能不能是笔记本的键盘坏了呢?还是笔记本出现了什么故障而引起键盘失灵呢…

End-to-End Object Detection with Transformers

DERT 目标检测 基于卷积神经网络的目标检测回顾DETR对比Swin Transformer摘要检测网络流程DERT网络架构编码器概述解码器概述整体结构object queries的初始化Decoder中的Muiti-Head Self-AttentionDecoder中的Muiti-Head Attention 损失函数解决的问题 基于卷积神经网络的目标检…

同步请求和异步请求

同步请求和异步请求是在网络编程中常用的两种通信模式,它们有以下区别: 同步请求: 在发送一个请求后,程序会一直等待服务器返回响应,期间无法进行其他操作。请求发出后,程序会阻塞在请求处,直…

Kubernetes 调度约束(亲和性、污点、容忍)

目录 一、Pod启动典型创建过程 二、调度流程 三、指定调度节点 1.使用nodeName字段指定调度节点 2.使用nodeSelector指定调度节点 2.1给对应的node节点添加标签 2.2修改为nodeSelector调度方式 3.通过亲和性来指定调度节点 3.1节点亲和性 3.2Pod亲和性与反亲和性 3.2…

在APP中如何嵌入小游戏?

APP内嵌游戏之所以能火爆,主要是因为互联网对流量的追求是无止境的,之前高速增长的红利期后,获取新的流量成为各大厂商的挑战,小游戏的引入,就是这个目的,为已有的产品赋能,抢占用户注意力和使用…

华为云零代码新手教学-体验通过Astro Zero快速搭建微信小程序

您将会学到 您将学会如何基于Astro零代码能力,DIY开发,完成问卷、投票、信息收集、流程处理等工作,还能够在线筛选、分析数据。实现一站式快速开发个性化应用,体验轻松拖拽开发的乐趣。 您需要什么 环境准备 注册华为云账号、实…