# CsharpSocketTest **Repository Path**: dotnet9/CsharpSocketTest ## Basic Information - **Project Name**: CsharpSocketTest - **Description**: C# socket测试:对象二进制序列化研究、TCP/UDP网络传输、WPF DataGrid大数据加载、刷新 - **Primary Language**: C# - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-12-23 - **Last Updated**: 2024-02-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C#百万对象序列化与网络传输实践 | 日期 | 更新内容 | 版本 | 作者 | | ---------- | ---------------------------------------------- | ----- | ------------ | | 2023-12-16 | 初建,添加网络对象定义 | 0.0.1 | 沙漠尽头的狼 | | 2023-12-24 | 修改数据类型,节约网络传输大小和减少数据包个数 | 0.0.2 | 沙漠尽头的狼 | | 2024-02-07 | 添加界面截图 | 0.0.3 | 沙漠尽头的狼 | [TOC] ## 1. 背景【0.0.1】 完善文章《[C#百万对象序列化深度剖析:如何在网络传输中实现速度与体积的完美平衡 (dotnet9.com)](https://dotnet9.com/2023/12/deep-analysis-of-csharp-million-object-serialization-how-to-achieve-a-perfect-balance-between-speed-and-volume-in-network-transm)》,以客户端实时获取服务端进程信息为测试案例: 1. 添加TCP通信,客户端通过命令方式向服务端请求数据,服务端可被动响应,也可主动推送; 2. 添加UDP通信,服务端可组播数据; 3. WPF百万数据DataGrid加载、实时更新。 ## 2. 功能 ### 2.1. 网络对象 #### 2.1.1. 数据包格式【0.0.1】 **数据包=头部+数据** 数据包头部 | 字段名 | 数据类型 | 说明 | | ------------- | -------- | ------------ | | PacketSize | int | 数据包总大小 | | SystemId | long | 系统Id | | ObjectId | byte | 对象Id | | ObjectVersion | byte | 对象版本 | 数据包数据部分 使用MessagePack对对象进行二进制压缩,数据包会比常规二进制序列化小,以下是目前使用到的对象列表: | 数据包类型 | 对象名 | 对象Id | 对象版本 | 说明 | | ---------- | ----------------------- | ------ | -------- | ---------------------------- | | TCP | RequestBaseInfo | 1 | 1 | 请求服务基本信息 | | TCP | ResponseBaseInfo | 2 | 1 | 响应请求服务基本信息 | | TCP | RequestProcessList | 3 | 1 | 请求进程详细信息列表 | | TCP | ResponseProcessList | 4 | 1 | 响应请求进程详细信息列表 | | TCP | UpdateProcessList | 5 | 1 | 更新进程详细信息列表 | | UDP | UpdateActiveProcessList | 6 | 1 | 更新进程常变化数据信息列表 | | TCP | ChangeProcessList | 7 | 1 | 进程结构变化:增加、减少进程 | | | | | | | | TCP | Heartbeat | 255 | 1 | TCP心跳包 | #### 2.1.2. 网络对象定义【0.0.1】 ##### RequestBaseInfo【0.0.1】 | 字段名 | 数据类型 | 说明 | | ------ | -------- | ------ | | TaskId | int | 任务Id | ##### ResponseBaseInfo【0.0.2】 | 字段名 | 数据类型 | 说明 | | ------------------ | -------- | ------------------------------------------------------------ | | TaskId | int | 任务Id | | OS | string? | 操作系统名称 | | MemorySize | byte | 系统内存大小(单位GB) | | ProcessorCount | byte | 处理器个数 | | DiskSize | short | 硬盘总容量(单位GB) | | NetworkBandwidth | short | 网络带宽(单位Mbps) | | Ips | string? | 服务器IP地址,多个IP地址以,分隔 | | TimestampStartYear | byte | 通信对象时间戳起始年份,比如:23,表示2023年1月1号开始计算时间戳,后面的时间戳都以这个字段计算为准,精确到0.1s,即100ms,主要用于节约网络对象传输大小 | | LastUpdateTime | uint | 最后更新时间 | ##### RequestProcessList【0.0.1】 | 字段名 | 数据类型 | 说明 | | ------ | -------- | ------ | | TaskId | int | 任务Id | ##### ResponseProcessList【0.0.1】 | 字段名 | 数据类型 | 说明 | | --------- | -------------------- | ---------- | | TaskId | int | 任务Id | | TotalSize | int | 总数据大小 | | PageSize | int | 分页大小 | | PageCount | int | 总页数 | | PageIndex | int | 页索引 | | Processes | `List?` | 进程列表 | ##### ProcessItem【0.0.2】 | 字段名 | 数据类型 | 说明 | | -------------- | -------- | --------------------- | | PID | int | 进程ID | | Name | string? | 进程名称 | | Publisher | string? | 发布者 | | CommandLine | string? | 命令行 | | Data | byte[8] | 见ProcessItemData定义 | | LastUpdateTime | uint | 上次更新时间 | | UpdateTime | uint | 更新时间 | ##### ProcessItemData【0.0.2】 | Offset | Size | 字段 | 说明 | | | ------ | ---- | --------------- | ------------------------------------------------------------ | ---- | | 0 | 10 | CPU | CPU(所有内核的总处理利用率),最后一位表示小数位,比如253表示25.3% | | | 10 | 10 | Memory | 内存(进程占用的物理内存),最后一位表示小数位,比如253表示25.3%,值可根据基本信息计算 | | | 20 | 10 | Disk | 磁盘(所有物理驱动器的总利用率),最后一位表示小数位,比如253表示25.3%,值可根据基本信息计算 | | | 30 | 10 | Network | 网络(当前主要网络上的网络利用率),最后一位表示小数位,比如253表示25.3%,值可根据基本信息计算 | | | 40 | 10 | GPU | GPU(所有GPU引擎的最高利用率),最后一位表示小数位,比如253表示25.3 | | | 50 | 1 | GPUEngine | GPU引擎,0:无,1:GPU 0 - 3D | | | 51 | 3 | PowerUsage | 电源使用情况(CPU、磁盘和GPU对功耗的影响),0:非常低,1:低,2:中,3:高,4:非常高 | | | 54 | 3 | PowerUsageTrend | 电源使用情况趋势(一段时间内CPU、磁盘和GPU对功耗的影响),0:非常低,1:低,2:中,3:高,4:非常高 | | | 57 | 1 | Type | 进程类型,0:应用,1:后台进程 | | | 58 | 2 | Status | 进程状态,0:正常运行,1:效率模式,2:挂起 | | ##### UpdateProcessList【0.0.1】 | 字段名 | 数据类型 | 说明 | | --------- | -------------------- | -------- | | Processes | `List?` | 进程列表 | ##### UpdateActiveProcessList【0.0.1】 | 字段名 | 数据类型 | 说明 | | --------- | -------------------------- | ------------------------------------------------------------ | | TotalSize | int | 总数据大小 | | PageSize | int | 分页大小 | | PageCount | int | 总页数 | | PageIndex | int | 页索引,客户端根据收到的进程详细信息列表为基础(有顺序关系),取当前数据包开始进程索引到结束进程索引数据更新更新 | | Processes | `List?` | 进程列表 | ##### ActiveProcessItem【0.0.2】 | 字段名 | 数据类型 | 说明 | | ---------- | -------- | --------------------------------------------------------- | | Data | byte[8] | 下面详细说明 | | UpdateTime | uint | 更新时间(当天时间戳:当日0点0分0秒计算的时间戳,单位ms) | ActiveProcessItemData【0.0.2】 | Offset | Size | 字段 | 说明 | | | ------ | ---- | --------------- | ------------------------------------------------------------ | ---- | | 0 | 10 | CPU | CPU(所有内核的总处理利用率),最后一位表示小数位,比如253表示25.3% | | | 10 | 10 | Memory | 内存(进程占用的物理内存),最后一位表示小数位,比如253表示25.3%,值可根据基本信息计算 | | | 20 | 10 | Disk | 磁盘(所有物理驱动器的总利用率),最后一位表示小数位,比如253表示25.3%,值可根据基本信息计算 | | | 30 | 10 | Network | 网络(当前主要网络上的网络利用率),最后一位表示小数位,比如253表示25.3%,值可根据基本信息计算 | | | 40 | 10 | GPU | GPU(所有GPU引擎的最高利用率),最后一位表示小数位,比如253表示25.3 | | | 50 | 1 | GPUEngine | GPU引擎,0:无,1:GPU 0 - 3D | | | 51 | 3 | PowerUsage | 电源使用情况(CPU、磁盘和GPU对功耗的影响),0:非常低,1:低,2:中,3:高,4:非常高 | | | 54 | 3 | PowerUsageTrend | 电源使用情况趋势(一段时间内CPU、磁盘和GPU对功耗的影响),0:非常低,1:低,2:中,3:高,4:非常高 | | ##### ChangeProcessList【0.0.1】 | 字段名 | 数据类型 | 说明 | | ------ | -------- | ---- | | | | | ##### Heartbeat【0.0.1】 | 字段名 | 数据类型 | 说明 | | ------ | -------- | ---- | | | | | ## 3. 效果 服务端使用WPF开发: ![](imgs/server.gif) 客户端使用WPF开发: ![](imgs/client.gif)