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

news2024/12/28 2:55:15

一、总体流程

  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.coloradmin.cn/o/876887.html

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

相关文章

Vue2(组件开发)

目录 前言一,组件的使用二,插槽slot三,refs和parent四,父子组件间的通信4.1,父传子 :父传子的时候,通过属性传递4.2,父组件监听自定义事件 五,非父子组件的通信六&#x…

JL701N编译后查看内存使用情况

编译之后,可以在 cpu/br28/tools/sdk.map 中查看实际的使用情况.

MySQL 账号权限

mysql 在安装好后,默认是没有远端管理账号。 一、账号管理 1. 查看账号列表 MySQL用户账号和信息存储在名为 mysql 的数据库中。一般不需要直接访问 mysql 数据库和表,但有时需要直接访问。例如,查看数据库所有用户账号列表时。 USE mysql; …

第G2周:人脸图像生成(DCGAN)

🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊] 1. DCGAN原理 深度卷积对抗网络(Deep Convolutional Generative Adversarial Networks, DCGAN&#…

Python的十二道编程题,码住战胜一切

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 一、计算文件大小 import os def get_size(path):size 0l [path]while l:path l.pop()lst os.listdir(path)for name in lst:son_path os.path.join(path,name)if os.path.isfile(son_path):size os.path.getsize(son_…

个人博客系统测试报告

文章目录 一、功能测试1.编写测试用例2.总结测试后发现的BUG 二、UI自动化测试0.搭建测试环境1. 创建公共类2.注册页面UI自动化测试用例编写3.登录页面UI自动化测试用例编写4.用户博客列表页面自动化测试5. 修改个信息页面6. 文章编辑页面7. 设置密保问题发现bug 8. 所有用户文…

QTreeView显示多级多列目录

效果图&#xff1a; 头文件&#xff1a; QStandardItemModel *m_treeMode;源文件 m_treeMode new QStandardItemModel(0,1,this);ui->treeView->setModel(m_treeMode);//控制第一列节点个数int mainLevel 3;for (int i 0; i < mainLevel; i) {QList<QStandar…

【设计模式】非GOF的常见设计模型

结构型模式 系列综述&#xff1a; 来源&#xff1a;该系列是主要参考《大话设计模式》和《设计模式(可复用面向对象软件的基础)》&#xff0c;其他详细知识点拷验来自于各大平台大佬的博客。 总结&#xff1a;设计模式汇总篇 如果对你有用&#xff0c;希望关注点赞收藏一波。 文…

无需停服!PostgreSQL数据迁移工具-NineData

PostgreSQL 是一种备受开发者和企业青睐的关系型数据库&#xff0c;其丰富的数据类型、地理空间负载和强大的扩展能力等特性使其备受欢迎。然而&#xff0c;在企业使用 PostgreSQL 承载应用的过程中&#xff0c;由于业务需要上云、跨云、下云、跨机房迁移、跨地域迁移、数据库版…

C语言学习笔记---操作符详解

C语言程序设计笔记---012 C语言操作符1、算数操作符1.1、算术操作符例程 2、移位操作符2.1、移位操作符例程12.2、移位操作符例程22.3、移位操作符例程3 3、位操作符3.1、位操作符例程13.2、位操作符例程23.3、位操作符例程3 --按位与&1扩展3.4、位操作符例程4 --按位异或^…

使用SpringAop切面编程通过Spel表达式实现Controller权限控制

目录 参考一、概念SpEL表达式 二、开发引入包定义注解定义切面定义用户上下文 三、测试新建Service在方法上注解新建Service在类上注解运行 参考 SpringBoot&#xff1a;SpEL让复杂权限控制变得很简单 一、概念 对于在Springboot中&#xff0c;利用自定义注解切面来实现接口…

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形&#xff0c;可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

Linux命令200例:adduser用于创建新用户

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

求Win11系统virtualbox+vagrant安装MacOS虚拟机

文章目录 一、背景二、素材2.1、virtualboxvagrant 三、问题3.1、安装失败3.2、第二个失败3.3、网络说 四、求助 一、背景 题主&#xff0c;主要是穷&#xff0c;没钱买mac笔记本或相关系统的苹果产品&#xff0c;哈哈&#xff0c;偶尔也有用过MacOS系统&#xff0c;只是还没有…

app专项测试:app弱网测试

目录 弱网测试背景 网络测试要点 弱网测试关注指标 弱网测试工具 fiddler模拟网络延时场景 网络设置参考 Network Emulator Toolkit模拟网络丢包场景&#xff08;windows网络&#xff09; APP弱网测试 弱网使用工具&#xff1a; app弱网测试要点 APP网络测试要点 网络…

OpenCV图像处理——模版匹配和霍夫变换

目录 模版匹配原理实现 霍夫变换霍夫线检测 模版匹配 原理 实现 rescv.matchTemplate(img,template,method)import numpy as np import cv2 as cv import matplotlib.pyplot as pltimgcv.imread(./汪学长的随堂资料/6/模板匹配/lena.jpg) templatecv.imread(./汪学长的随堂资…

一文搞懂Jenkins持续集成解决的是什么问题

1、持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的…

uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

一、效果&#xff1a; 如下图所示&#xff0c;进入该页面后&#xff0c;默认选中第一个分类&#xff0c;以及第一个分类下的列表数据。 二、代码实现&#xff1a; 关键代码&#xff1a; 进入页面时&#xff0c;默认调用分类的接口&#xff0c;在分类接口里做判断&#xff…

Android 网络编程-网络请求

Android 网络编程-网络请求 文章目录 Android 网络编程-网络请求一、主要内容二、开发网络请求前的基本准备1、查看需要请求的网址是否有效&#xff08;1&#xff09;通过网页在线验证&#xff08;2&#xff09;使用专用window网咯请求工具&#xff08;3&#xff09;编写app代码…

less学习语法

1.CSS函数的补充 1.rgb/rgba/translate/rotate/scale 2.非常好用的css函数&#xff1a; var:使用css定义的变量calc:计算css值&#xff0c;通常用于计算元素的大小或位置blur:毛玻璃&#xff08;高斯模糊&#xff09;效果gradient:颜色渐变函数 var:定义变量 css中可以自定…