ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

现代化 WPF 即时通讯应用开发:.NET 多进程与 MMF 零拷贝的高性能 IM 实现

现代化 WPF 即时通讯应用开发:.NET 多进程与 MMF 零拷贝的高性能 IM 实现 KeiChat 基于 .NET 9 的现代化 WPF 桌面即时通讯系统多进程架构 · MMF 零拷贝通信 · 严格 MVVM 设计 项目简介KeiChat是一款始于2018 年的桌面即时通讯系统早期基于 .NET Framework 4.5 WPF 构建作为公司内部核心通讯工具持续服务于日常协作。历经多年业务考验与架构演进项目先后跨越 .NET Framework 4.5 → .NET Core → .NET 5/6/8最终于 .NET 9 时代完成全面现代化升级如今正式开源回馈社区。八年来KeiChat伴随着公司内部业务的持续增长不断迭代从最初满足基础通讯需求的内部工具逐步演进为如今架构成熟、性能卓越的桌面 IM 解决方案。每一个架构决策都来自真实高并发场景下的实战检验。在架构设计上KeiChat深度参考主流 IM 的最佳实践采用多进程架构彻底实现消息通信与 UI 渲染的解耦通过MemoryMappedFile内存映射文件技术实现进程间零拷贝数据传输在确保界面极致流畅、响应灵敏的同时为高并发消息处理、大文件传输及实时通知提供了坚实的底层支撑。在实时通信上KeiChat采用了原生 Socket 自定义二进制协议 SSL/TLS 加密构建实时通信层支持文本、表情、图片、视频、文件、名片、转发、撤回、收藏等完整 IM 功能矩阵覆盖单聊、群聊、联系人管理、好友圈等核心场景是构建企业级内部通讯系统的理想解决方案。本项目既可作为WPF MVVM 架构最佳实践的学习案例也可作为高性能桌面 IM 项目的二次开发基础。最新版本 · 现代化界面.NET 9 基于 .NET 9 全面重构多主题模式、多进程架构、零拷贝通信、极致流畅体验。2018 年 · 早期版本.NET Framework 4.5经典 WPF 风格界面满足团队基础即时通讯需求。✨ 核心架构亮点1. ️ 严格 MVVM 与 UI 解耦项目采用C# WPF MVVM (Model-View-ViewModel)模式彻底分离 UI 与业务逻辑数据驱动 UI通过INotifyPropertyChanged和ICommand实现界面动态更新无需手动操作控件。高可测试性业务逻辑集中于 ViewModel支持脱离 UI 进行单元测试。代码复用核心业务逻辑可无缝迁移至其他 .NET 平台如 MAUI, Avalonia。2. ⚡ 多进程架构UI 与通信进程隔离为了解决 UI 卡顿与实时通信阻塞问题项目采用了多进程架构进程职责UI 渲染进程负责界面展示、动画、输入交互、会话管理通信进程负责 Socket 连接、消息收发、好友/群组同步、推送通知文件进程图片处理、视频处理、文件传输图片视频媒体进程浏览图片和播放视频优势UI 进程始终轻量消息洪峰时依然保持60 FPS 的丝滑体验通信、文件、图片视频媒体进程异常或重启不影响 UI 进程稳定性进程架构的协作Socket 接收线程→ 接收服务器二进制数据包校验与反序列化消息分发线程→ 将消息按会话分类写入对应 MMF 区域UI 进程→ 监听 MMF 变更事件读取消息并更新 ViewModel发送流程→ UI → MMF → 通信进程 → 序列化 → SSL Socket → 服务器3. ️ 实时通信技术KeiChat的实时消息系统完全基于原生 Socket构建而非 HTTP 长轮询或高层封装协议自定义二进制数据包协议为降低带宽占用并提升解析效率设计了轻量级二进制协议字段说明Version协议版本号SerializeType序列化类型PacketType数据包类型单聊/群聊/心跳SequenceId数据包序列号用于去重与排序BodyLength包体长度Body序列化后的消息数据MemoryPack / ProtobufChecksumCRC32 校验防止数据损坏SSL/TLS 加密传输使用SslStream封装原始 Socket实现端到端加密TLS 1.2客户端校验服务器证书防止中间人攻击所有消息、信令数据均通过加密通道传输4. 数据同步设计KeiChat需要从业务服务器获取用户列表、好友列表、群组列表、群组成员等大量数据。若每次都全量拉取存在以下问题流量浪费客户端本地已缓存绝大部分数据重复下载成本高响应慢数据量大时首屏等待时间长服务器压力大大量重复查询挤占资源。基于上述问题我们采用增量同步 (Incremental Sync)策略核心目标是首次启动时全量拉取并缓存至本地 SQLite此后每次启动或下拉刷新时仅同步自上次成功同步以来新增或修改的数据最大限度减少流量、提升响应速度、降低服务端压力。客户端每次发起同步请求时携带上一次同步成功的时间戳 (Timestamp)服务器据此仅返回该时间戳之后发生变更的数据。客户端将增量结果落地本地数据库覆盖或插入从而与远端保持一致。整个机制可以概括为三个核心要素同步锚点客户端记录的我已同步到哪个时间点即上一次成功同步的Timestamp。变更数据服务器只返回update_time anchor的数据新增 修改。本地持久化增量数据落地 SQLite覆盖/插入缓存长期有效。一句话总结客户端用anchor记住同步到哪里服务端只返回此后的变更客户端在事务中幂等地落库并更新锚点——从而形成高效、可靠、断点续传的增量同步闭环。5. HTTPS 安全性KeiChat为防范传输层中间人攻击Man-in-the-Middle, MITM客户端在 HTTPS 通信中实施了严格的证书绑定SSL/TLS Pinning策略。具体实现如下预置信任锚将服务端默认的 X.509 证书哈希硬编码至客户端资源中。握手期强校验TLS 握手时除系统级 CA 信任链验证外额外执行证书指纹比对仅接受与锁定信息完全匹配的服务器证书。防御效果由于主流抓包代理工具依赖动态签发伪造证书其证书指纹无法匹配客户端内置的信任锚握手将被主动终止 (SSLHandshakeException)。从而有效杜绝了通过诱导用户安装代理 CA 证书进行的流量解密、请求篡改与敏感信息泄露风险。 功能一览 聊天功能功能名称功能介绍文本消息单次最大支持 800 个字符支持默认表情、自动识别链接和号码表情消息可发送收藏的动画表情收到的表情可添加到自己的表情列表️图片消息单次最多发送 9 张支持压缩、断点续传、原图查看、保存视频消息单次最多发送 1 个支持断点续传、上传进度与状态显示文件消息单次最多发送 1 个支持断点续传、上传进度与状态显示名片消息可发送联系人个人信息名片收到的名片可查看详情或加为好友↪️转发消息支持逐条转发和合并转发可转发给多个联系人↩️撤回消息发送 2 分钟内可撤回文本消息撤回 5 分钟内可重新编辑再发⭐收藏消息可将接收到的消息收藏到列表支持从收藏转发给其他联系人新消息提醒消息列表数字角标提醒任务栏有弹窗提醒消息状态发送时显示状态/进度失败时可查看错误查找聊天记录模糊搜索本地所有聊天记录快速定位文本、图片、视频、文件等消息置顶联系人重要联系人置顶至聊天列表顶部并高亮提醒免打扰设置免打扰后不再收到提醒️清空聊天记录可清空某个对话的所有本地聊天记录‍‍ 群聊功能功能名称功能介绍➕发起群聊选择联系人创建群聊可设置群头像/名称默认拼图头像群最大 2000 人采用读扩散模型加入群聊支持邀请入群、群名片、搜索群号/群名称等方式加入群公告群主/管理员可发布公告群成员可查看支持删除与编辑群名片可分享/转发群名片他人根据名片即可加入群聊‍♂️成员管理群主/管理员可删除成员可设置指定成员禁言✏️设置名称群主/管理员可改名改名后通知群内所有成员️设置群头像群主/管理员可设置群头像设置群简介群主/管理员可设置简介在群详情中展示设置管理员群主可添加或删除管理员设置禁言可设全员禁言或指定成员禁言全员禁言后仅群主/管理员可发言加群申请开启审核后新成员申请在列表显示需处理后才能入群加群方式支持允许任何人加入 / 不允许加入 / 需审核三种模式搜索方式控制群对外搜索权限不可搜索 / 仅群号 / 群名或关键字转让群群主可将群转让给群内某个成员退出群聊成员可退出退出前可选择保留或清除聊天记录解散群聊群主可解散群聊所有成员将被移除‍♂️联系人功能功能名称功能介绍➕新好友通过邮箱/手机号/账号搜索申请加好友需对方同意后成为好友️标签可给联系人设置分类标签便于管理好友资料查看好友信息设置备注、好友权限预览图片/视频/好友圈缩略图加入黑名单拉黑后对方无法查看好友圈动态或发送消息️删除联系人删除后双方无法查看好友圈动态和发送消息 好友圈功能功能名称功能介绍发布支持发表文字、表情、图片、视频等内容可选择可见范围点赞支持点赞与取消点赞评论支持评论、回复评论、删除评论浏览在好友圈列表中预览内容可进行点赞和评论⚙️ 其他功能功能名称功能介绍⭐收藏收藏聊天中的文本/语音/图片/视频等消息以及好友圈图片/视频支持删除和转发表情从相册选图添加到表情列表可添加他人发送的动画表情支持删除和排序️设置设置通讯号、昵称、头像、邮箱、手机号、消息通知、清空本地所有聊天记录、外观、本地存储位置 系统体验系统托盘关闭窗口最小化到托盘右键退出新消息图标闪烁现代化 UI基于 WPF 样式与控件模板支持主题切换深色、浅色主题️ 界面截图⚠️素材声明本仓库截图中所展示的头像、图片消息、好友圈配图等均来源于互联网仅用于产品功能演示并非本应用程序实际生成或收集的内容。相关素材的版权归原作者所有若您是版权方且认为使用不当请联系我们移除。本项目不对截图中的第三方素材主张任何权利。登录与注册主聊天界面好友与群组好友圈与收藏图片查看与视频播放操作系统支持操作系统状态备注Windows 7✅ 支持SP1 及以上.NET 6 Runtime 自带所需功能Windows 8.1✅ 支持直接支持Windows 10✅ 推荐最佳体验Win10 1903Windows 11✅ 推荐最佳体验❌Windows XP❌ 不支持WPF 需 .NET Framework 3.0已放弃支持✅KeiChat 向下兼容至 Windows 7无需手动安装 .NET Framework.NET 6 运行时已包含 WPF 全部所需组件。 安装体验Windows x64Windows8、Windows10、Windows11Windows 7 x64https://gitee.com/keisoft/keichat.wpf/releases/tag/6.0.5️ 技术栈开发框架.NET 6 或.NET 9桌面框架WPF架构模式MVVM实时通信原生 Socket 自定义二进制协议 SSL/TLS序列化MemoryPack / Protobuf进程通信MemoryMappedFile SemaphoreUI 渲染WPF 控件模板 动画本地数据存储SQLite3好友、群组、好友圈、聊天记录 开发环境要求Windows 10/11.NET 6 SDK 或 .NET 9 SDKVisual Studio 2022 服务端一键部署Docker Compose查看 Keisoft.Chat.Server 部署方案App.xaml.cs配置如下// KeiChat 业务服务的网关地址。 AppSettings.SetGateway(https://demo-chat.example.com); // KeiChat 文件服务的网关地址。 AppSettings.SetUploadFileGateway(https://demo-chat.example.com/upload-file); AppSettings.SetUploadVideoGateway(https://demo-chat.example.com/upload-video); AppSettings.SetUploadPictureGateway(https://demo-chat.example.com/upload-image); // 保留 upload-audio、upload-merge。 AppSettings.SetUploadAudioGateway(https://demo-chat.example.com/upload-audio); AppSettings.SetUploadMergeGateway(https://demo-chat.example.com/upload-merge); // 即时通讯服务的网关地址。可写 https (ims)、或 http (im) AppSettings.SetIMServerHost(ims://demo-im.example.com); // 非 80 或 433 在这里指定端口。 // AppSettings.SetIMServerPort(8080);⚖️使用条款与免责声明1.合法使用本系统的使用受以下条件限制您确认并同意仅将本系统用于合法目的并遵守所有适用的法律法规包括但不限于您所在司法管辖区、行为发生地及目标影响地的相关法律。您不得利用本系统从事任何侵犯他人合法权益、违反法律规定或危害网络安全的行为。若您违反上述任何条件本授权立即终止您必须立即停止使用本系统并删除所有相关副本。因您违反本声明导致的任何法律责任由您自行承担本项目维护者保留追究法律责任的权利。2.开源性质本项目以开源形式提供供学习、研究与技术交流之用。开发者不对本系统的功能完整性、安全性、稳定性或适用性作任何明示或暗示的保证。3.无担保声明在法律允许的最大范围内开发者不对因使用或无法使用本系统所导致的任何直接、间接、附带、特殊或后果性损害承担责任包括但不限于数据丢失、业务中断或其他商业损害。4.风险自担您理解并同意使用本系统所产生的所有风险由您自行承担包括但不限于系统漏洞、第三方依赖风险及运行环境风险。5.素材声明本仓库截图中所展示的头像、图片消息、好友圈配图等内容均来源于互联网仅用于产品功能演示并非本应用程序实际生成或收集的内容。相关素材版权归原作者所有若您是权利人且认为使用不当请联系我们处理。6.知识产权本系统及相关代码、文档的知识产权归原作者所有。未经书面许可不得将本系统用于商业目的或擅自篡改、再分发。 源码仓储GitHub: https://github.com/macroecho/keichat.wpfGitee: https://gitee.com/keisoft/keichat.wpf
返回列表