消息系統技術文檔

消息系統技術文檔

概述

本文檔詳細說明了如何在現有的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;先看上半部分 第一行是…