消息系统技术文档

概述

本文档详细说明了如何在现有的LHD通信系统中添加自己的消息类型,包括消息的发送、接收、解析和处理的完整流程。

系统架构

消息流程架构图

客户端B
服务端
通信框架
客户端A
消息解析
TCP接收
消息ID匹配 0x0006
ParsePackage
触发ReceiveDefaultMessage事件
反射获取属性
显示消息内容
TCP监听
MessageServerApp
消息路由
转发到目标客户端
消息序列化
MessageCommunicationClient
TCP发送
发送李宏利消息
MessageClientApp
创建Lihongli2Message
调用SendMessage

时序图

客户端AMessageServerApp客户端B发送李宏利消息(0x0006)消息路由处理转发消息到客户端B消息解析(ParsePackage)事件触发(ReceiveDefaultMessage)显示消息内容客户端AMessageServerApp客户端B

一、项目结构与依赖关系

1.1 核心项目

  • Lihongli2Message: 消息类型定义项目
  • MessageCommunicationServer: 服务端通信组件
  • MessageCommunicationClient: 客户端通信组件
  • MessageServerApp: 服务端应用程序
  • MessageClientApp: 客户端应用程序

1.2 依赖关系修复

在添加李宏利消息类型过程中,修复了以下依赖关系问题:

<!-- Demos/HomeWork/Lihongli2Message/Lihongli2Message.csproj -->
<ItemGroup><!-- 修复前:路径错误 --><ProjectReference Include="..\..\Configuration\SystemConst\SystemConst.csproj" /><!-- 修复后:正确的相对路径 --><ProjectReference Include="..\..\..\Configuration\SystemConst\SystemConst.csproj" /><ProjectReference Include="..\..\..\MessageCommunication\CommunicationTCPMessage\CommunicationTCPMessage.csproj" />
</ItemGroup>

二、消息类型实现

2.1 消息类定义

文件: Demos/HomeWork/Lihongli2Message/Lihongli2Message.cs

using System;
using System.Text;
using CommunicationMessage;namespace CommunicationMessage.MessageObject
{[Serializable]public class Lihongli2Message : MessageBase{public string SenderName { get; set; } = "";public string MessageContent { get; set; } = "";public DateTime SendTime { get; set; }public string MessageType { get; set; } = "李宏利消息";// 关键:使用消息ID 0x0006 和正常消息类型public Lihongli2Message() : base((byte)EnumDispatchMessageTypeID.EnumNornalMessage, 0x0006){this.SendTime = DateTime.Now;this.DataLength = 0;}// 消息序列化public override byte[] BuildPackage(){string messageString = $"{SenderName}|{MessageContent}|{SendTime:yyyy-MM-dd HH:mm:ss}|{MessageType}";byte[] data = Encoding.UTF8.GetBytes(messageString);this.DataLength = data.Length;return data;}// 消息反序列化public override void ParsePackage(byte[] data, int startIndex){try{if (data == null || data.Length < startIndex + DataLength){return;}byte[] messageData = new byte[DataLength];Array.Copy(data, startIndex, messageData, 0, DataLength);var message = FromBytes(messageData);if (message != null){this.SenderName = message.SenderName;this.MessageContent = message.MessageContent;this.SendTime = message.SendTime;this.MessageType = message.MessageType;}}catch (Exception ex){Console.WriteLine($"解析李宏利消息包失败: {ex.Message}");}}}
}

2.2 消息ID注册

文件: MessageCommunication/CommunicationTCPMessage/EnumDispatchMessageID.cs

public enum EnumDispatchMessageID : UInt32
{// 其他消息ID...//lihongli消息 - 关键:分配唯一IDEnumMessagelihongli = 0x0006,
}

三、消息发送实现

3.1 客户端发送逻辑

文件: MessageCommunication/MessageClientApp/Program.cs

private static void SendLihongli2Message()
{Console.WriteLine("=== 发送李宏利消息 ===");// 收集用户输入Console.Write("请输入发送者姓名: ");string senderName = Console.ReadLine() ?? "匿名";Console.Write("请输入消息内容: ");string content = Console.ReadLine() ?? "";Console.Write("请输入消息类型 (默认:李宏利消息): ");string messageType = Console.ReadLine()?.Trim() ?? "李宏利消息";// 创建并发送消息var message = new Lihongli2Message(senderName, content, messageType);ServerApp.SendMessage((uint)EnumTCPCommunicationChannel.ClientView, message);Console.WriteLine($"发送李宏利消息: {message.ToJsonString()}");
}

四、消息接收与路由

4.1 消息路由机制

文件: MessageCommunication/MessageCommunicationClient/CommunicationClientReceivePackage.cs

private void ReceivePackage(MessagePackage package)
{// 提取消息码uint messageCode = package.MessageCode & 0x00FFFFFF;Console.WriteLine($"收到消息包: MessageCode=0x{package.MessageCode:X}, 处理后=0x{messageCode:X}");switch ((EnumDispatchMessageID)messageCode){case EnumDispatchMessageID.EnumMessagelihongli: // 李宏利消息路由Console.WriteLine("✓ 匹配到李宏利消息,开始处理...");if (ReceiveDefaultMessage != null){// 创建消息对象并设置属性Lihongli2Message msg = new Lihongli2Message(){MessageSource = package.MessageSource,MessageTarget = package.MessageTarget,DataLength = package.DataLength,};// 解析消息数据msg.ParsePackage(package.MessageData, 0);Console.WriteLine("✓ 李宏利消息解析完成,触发事件");// 触发事件处理ReceiveDefaultMessage(msg);}break;// 其他消息类型处理...}
}

五、消息处理与显示

5.1 事件处理器

文件: MessageCommunication/MessageClientApp/Program.cs

private static void ServerApp_ReceiveDefaultMessage(MessageBase message)
{try{Console.WriteLine($"事件处理器被调用,消息类型: {message.GetType().Name}");Console.WriteLine($"消息码: 0x{message.GetMessageCode():X}");// 检查是否是李消息if (message.GetMessageCode() == 0x0006) // Lihongli2Message的消息码{Console.WriteLine("✓ 消息码匹配,检查消息类型...");// 使用反射安全地访问属性var senderNameProperty = message.GetType().GetProperty("SenderName");var messageContentProperty = message.GetType().GetProperty("MessageContent");var sendTimeProperty = message.GetType().GetProperty("SendTime");var messageTypeProperty = message.GetType().GetProperty("MessageType");if (senderNameProperty != null && messageContentProperty != null && sendTimeProperty != null && messageTypeProperty != null){Console.WriteLine("✓ 使用反射成功获取消息属性");// 显示消息内容Console.WriteLine("\n=== 收到李宏利消息 ===");Console.WriteLine($"发送者: {senderNameProperty.GetValue(message)}");Console.WriteLine($"内容: {messageContentProperty.GetValue(message)}");Console.WriteLine($"时间: {sendTimeProperty.GetValue(message)}");Console.WriteLine($"类型: {messageTypeProperty.GetValue(message)}");Console.WriteLine("=====================");}}}catch (Exception ex){Console.WriteLine($"处理李消息时发生错误: {ex.Message}");}
}

六、关键修改文件清单

6.1 新增文件

  • Demos/HomeWork/Lihongli2Message/Lihongli2Message.cs - 消息类定义
  • Demos/HomeWork/Lihongli2Message/Lihongli2Message.csproj - 项目配置

6.2 修改的文件

文件路径修改内容说明
MessageCommunication/CommunicationTCPMessage/EnumDispatchMessageID.cs添加 EnumMessagelihongli = 0x0006注册消息ID
MessageCommunication/MessageCommunicationClient/CommunicationClientReceivePackage.cs添加李宏利消息处理分支消息路由
MessageCommunication/MessageClientApp/Program.cs添加发送和接收处理逻辑客户端功能
MessageCommunication/MessageServerApp/Program.cs添加李宏利消息创建示例服务端功能

6.3 项目引用修复

  • 修复了 Lihongli2Message.csproj 中的相对路径引用
  • 确保所有依赖项目能够正确编译和链接

七、测试验证

7.1 成功运行日志示例

Input debug command to show info...
收到消息包: MessageCode=0x6, 处理后=0x6
✓ 匹配到李宏利消息,开始处理...
ParsePackage: data长度=54, startIndex=0, DataLength=54
ParsePackage: 复制的数据长度=54
ParsePackage: 原始数据=李宏利|11111111111111111111|2025-08-04 22:57:37|123
ParsePackage: FromBytes成功,设置属性
ParsePackage: 设置完成 - SenderName='李宏利', Content='11111111111111111111'
✓ 李宏利消息解析完成,触发事件
事件处理器被调用,消息类型: Lihongli2Message
消息码: 0x6
✓ 消息码匹配,检查消息类型...
✓ 使用反射成功获取消息属性=== 收到李宏利消息 ===
发送者: 李宏利
内容: 11111111111111111111
时间: 2025/8/4 22:57:37
类型: 123
=====================

八、添加新消息类型的通用步骤

基于李宏利消息的实现经验,添加新消息类型的通用步骤:

  1. 定义消息类

    • 继承 MessageBase
    • 分配唯一的消息ID
    • 实现 BuildPackage()ParsePackage() 方法
  2. 注册消息ID

    • EnumDispatchMessageID 中添加新的枚举值
  3. 添加消息路由

    • CommunicationClientReceivePackage.cs 中添加处理分支
  4. 实现发送逻辑

    • 在客户端应用中添加发送功能
  5. 实现接收处理

    • 在事件处理器中添加消息处理逻辑
  6. 测试验证

    • 编译所有项目
    • 运行服务端和客户端进行测试

九、注意事项

  1. 消息ID唯一性: 确保每种消息类型都有唯一的消息ID
  2. 序列化格式: 保持 BuildPackage()ParsePackage() 方法的格式一致性
  3. 错误处理: 在消息解析和处理过程中添加适当的异常处理
  4. 项目依赖: 确保所有项目引用路径正确,能够正常编译
  5. 向后兼容: 新增消息类型不应影响现有消息处理逻辑

十、编译和部署指南

10.1 编译顺序

# 1. 编译依赖项目
dotnet build Configuration/SystemConst/SystemConst.csproj
dotnet build MessageCommunication/CommunicationTCPMessage/CommunicationTCPMessage.csproj# 2. 编译消息类项目
dotnet build Demos/HomeWork/Lihongli2Message/Lihongli2Message.csproj# 3. 编译应用程序
dotnet build MessageCommunication/MessageServerApp/MessageServerApp.csproj
dotnet build MessageCommunication/MessageClientApp/MessageClientApp.csproj# 4. 编译整个解决方案
dotnet build LHDDispatch.sln

10.2 运行说明

# 启动服务端
dotnet run --project MessageCommunication/MessageServerApp/MessageServerApp.csproj# 启动客户端(在新的终端窗口中)
dotnet run --project MessageCommunication/MessageClientApp/MessageClientApp.csproj

文档版本: 1.0
创建时间: 2025年8月4日
最后更新: 2025年8月4日
文档位置: D:\APPfile\Cshape_learn\LHD\李宏利消息系统技术文档.md

本文档记录了李消息系统的完整实现过程,可作为后续添加其他消息类型的参考模板。

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

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

相关文章

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势树形图

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博舆情数据可视化分析-热词情感趋势树形图…

8月4日 强对流天气蓝色预警持续:多地需警惕雷暴大风与短时强降水

中央气象台8月4日10时继续发布强对流天气蓝色预警,提醒广大民众注意防范即将到来的恶劣天气。 预警详情: 时间范围: 8月4日14时至5日14时 影响区域: 雷暴大风或冰雹: 西北地区中东部、华北中北部、华南南部等地,风力可达8级以上。 短时强降水: 西北地区中东部、华北、…

C语言数据结构(4)单链表专题2.单链表的应用

1. 链表经典算法——OJ题目 1.1 单链表相关经典算法OJ题1&#xff1a;移除链表元素 1.2 单链表相关经典算法OJ题2&#xff1a;反转链表 1.3 单链表相关经典算法OJ题3&#xff1a;合并两个有序链表 1.4 单链表相关经典算法OJ题4&#xff1a;链表的中间结点 1.5 循环链表…

Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。

下面分别给出一个 Shell 脚本和 C 程序的例子&#xff0c;实现通过 Shell 脚本发送信号给 C 应用程序&#xff0c;让 C 应用程序回收线程资源后自行退出。原理在 Linux 系统中&#xff0c;我们可以使用信号机制来实现进程间的通信。Shell 脚本可以使用 kill 命令向指定的进程发…

C++入门自学Day6-- STL简介(初识)

往期内容回顾 C模版 C/C内存管理&#xff08;初识&#xff09; C/C内存管理&#xff08;续&#xff09; STL简介&#xff1a; STL 是 C 标准库的重要组成部分&#xff0c;是一个通用程序设计的模板库&#xff0c;用于数据结构和算法的复用。它极大地提升了代码效率、可靠性…

从零开始搞定类与对象(中)

运算符重载1.当运算符被用于类类型的对象时&#xff0c;C语言允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使用运算符时&#xff0c;必须转换成调用对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。2. 运算符重载是具有特殊名字的函…

SpringMVC实战指南:从环境搭建到功能实现全解析

第一章&#xff1a;SpringMVC环境搭建与基础配置1.1 Maven依赖配置在Maven项目中&#xff0c;SpringMVC的依赖配置是开发的第一步。根据Spring官方推荐&#xff0c;以下是SpringMVC 5.3.x版本的Maven依赖配置&#xff1a;<dependencies><!-- Spring MVC核心依赖 -->…

Repo 与 manifest

Manifest&#xff1a;它本身就是一个 git 仓库&#xff0c;其中存放的都是包含仓库和子仓库信息的XML文件。这些文件全部由开发者或者维护者手动配置并自己上传到 git 仓库。另外&#xff1a;Manifest 中的仓库之间的依赖关系 repo 也并不关心。所以它们可以是同级的也可以是包…

深入浅出 RabbitMQ:简单队列实战指南

大家好&#xff0c;我是工藤学编程 &#x1f989;一个正在努力学习的小博主&#xff0c;期待你的关注实战代码系列最新文章&#x1f609;C实现图书管理系统&#xff08;Qt C GUI界面版&#xff09;SpringBoot实战系列&#x1f437;【SpringBoot实战系列】SpringBoot3.X 整合 Mi…

Ubuntu22-Qt Creator-fcitx-中文输入

fcitx在ubuntu系统中路径 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ /usr/lib/x86_64-linux-gnu/qt6/plugins/platforminputcontexts/ fcitx-qt5-1.2.7 编译 下载链接:https://github.com/fcitx/fcitx-qt5/archive/refs/tags/1.2.7.zip Qt版本:Qt C…

【Java基础|第十三篇】面向对象基础(三)——继承(一)继承的理解,实现,特点……

&#xff08;四&#xff09;面向对象&#xff1a; 5、继承&#xff1a; &#xff08;1&#xff09;理解&#xff1a; 概念&#xff1a; 继承是面向对象的三大特征之一 继承是类与类之间关系的一种&#xff08;是父类与子类的关系&#xff09; 使用场景&#xff1a; 一个类与另…

QGIS绿色版吉林一号切片体验版插件(Jilin1Tiles)更新

吉林一号更新2024年图源了但吉林一号切片体验版插件&#xff08;Jilin1Tiles&#xff09;还没有更新&#xff0c;我修改了一下代码&#xff0c;直接集成到QGIS绿色版中。如下&#xff1a;注意&#xff1a;第一次使用的时候需要选中启用一下插件&#xff1a;需要使用的可以直接下…

git操作命令和golang编译脚本

git子模块信息处理命令git init submodule git submodule updategit取消合并 git merge --abort git reset --hard HEAD{1}bat文件生成二进制set GOOSlinux set GOARCHamd64 go env -w GOFLAGS-modvendor go build -ldflags "-w -s" -ohallapiset GOOSlinux set GOAR…

通往L4之路:构建自我进化的智能驾驶决策大脑

摘要&#xff1a; 本文旨在提出一个超越当前主流“感知-预测-规划”分离式架构的下一代自动驾驶决策系统方案。面对自动驾驶领域最核心的“长尾场景”难题&#xff0c;本文借鉴并升华了一套源于复杂策略制定的决策智能框架&#xff0c;通过构建动态驾驶世界模型&#xff08;Dyn…

AI编程助手:终结996的新希望

引言程序员工作现状与“996”现象的普遍性AI技术快速发展对编程效率的潜在影响核心问题&#xff1a;AI IDE与AI辅助编程能否改变传统开发模式AI IDE与AI辅助编程的核心技术AI IDE的定义与功能&#xff08;代码补全、错误检测、自动重构等&#xff09;AI辅助编程工具&#xff08…

Anthropic 禁止 OpenAI 访问 Claude API:商业竞争与行业规范的冲突

Anthropic 禁止 OpenAI 访问 Claude API&#xff1a;商业竞争与行业规范的冲突 文章来源&#xff1a;Poixe AI 本周&#xff0c;美国 AI 公司 Anthropic 宣布禁止 OpenAI 通过 API 访问其 Claude 系列大模型。这一举动引发了行业对"友好基准测试"与商业竞争边界的热…

区块链 + 物联网落地案例:供应链溯源系统开发全记录

本文详细记录了区块链与物联网技术融合的供应链溯源系统开发全流程。从项目背景出发&#xff0c;阐述传统供应链溯源痛点&#xff0c;介绍系统开发的技术架构设计&#xff0c;包括物联网数据采集层、区块链数据存储层等核心模块&#xff0c;详解硬件选型、智能合约编写、数据上…

Windows环境下Intel Fortran如何安装配置NetCDF

NetCDF(Network Common Data Form)格式,简称nc格式,是一种自描述、与平台无关的二进制数据文件,特别适合多维数据的存储和交换,广泛应用于气象、海洋、地球科学等领域。本文介绍Windows环境下IntelFortran安装配置NetCDF的过程。 一、系统环境及准备工作 1. 系统 Wind…

tcp/udp的socket特点

tcp &#xff1a; 绑定一个 socket 只是用来监听&#xff0c;accept 对每个客户端生成一个 socket 用来维护滑动窗口等。每个客户端用一个 socket 用来维护滑动窗口等。 4 次挥手对应两次 close 的 fin 和返回的 ack。 而三次挥手在 connect 里阻塞完成。 ​udp &#xff1a; 双…

Linux命令top

top一、 命令二、 如何查看top输出的结果一、 命令 top命令是Linux中的一个实时进程监控工具&#xff0c;类似于windows中的任务管理器。 基本命令 top二、 如何查看top输出的结果 我们需要分析top输出的结果 top输出的结果分为上下两部分&#xff0c;先看上半部分 第一行是…