跳到主要内容
版本:4.0

Tcp在WPF、Winform中的企业级应用

本节介绍基于TouchSocket和Baboon框架的TCP企业级应用开发方案,包括整体架构设计、服务器端和客户端项目组成、Baboon框架的轻量级特性及其在WPF和WinForm中的插件化开发支持,以及微软IOC框架的完美集成,为后续开发奠定基础框架。


本节演示服务器端项目创建过程,使用VS创建BigDogServer解决方案,包含主程序项目和通用库项目两部分,选择.NET 8跨平台控制台应用,配置项目引用关系,完成服务器端基础项目结构的搭建。


本节创建客户端解决方案BigDogClient,包括核心库、模块库、WinForm主程序和WPF主程序四个项目,配置不同框架版本(WinForm使用.NET Framework 4.6.2,WPF使用.NET 8),完成客户端项目结构的建立和引用关系配置。


本节配置解决方案级别的编码规范和编译设置,添加.editorconfig文件统一代码风格,创建Directory.Build.props配置文件设置版本号、输出目录、安全代码等属性,规范化项目配置,为团队协作和项目管理建立标准。


本节继续完善解决方案配置,调整输出目录为解决方案根目录的build文件夹,配置多启动项目支持WinForm和WPF同时调试,处理高分辨率显示器兼容性问题,通过引用现有项目的方式实现客户端和通信库的关联。


本节引入Baboon框架改造客户端,在WPF和WinForm项目中安装Baboon包,修改App.xaml继承BaboonWpfApplication,在App.cs中实现抽象成员包括初始化、启动和创建主窗口方法,利用Baboon的IOC容器和模块化能力提升项目架构。


本节设计TLV格式的通信协议,包含Logo标识(TS)、Tag标签、Length长度和Value数据四部分,实现BigDogAdapter固定包头适配器继承CustomFixedHeaderDataHandlingAdapter,创建BigDogRequestInform数据模型,完成协议的解析和封装逻辑。


本节优化通信协议增加TransactionID事务标识支持一问一答的并发请求,将数据体从ByteBlock改为byte[]数组减少GC压力,优化RequestInform的Value属性实现数据缓存,创建SetValue和SetJsonValue扩展方法支持JSON序列化,提升协议性能和易用性。


本节完善服务器和客户端基础通信框架,服务器端创建TcpService配置监听端口、日志记录和适配器,客户端创建IBigDogClientService接口和实现类,封装TCP客户端初始化、连接方法,通过IOC容器注入服务实现解耦,完成双端通信基础架构。


本节完善客户端通信框架,在Model项目中引入Baboon框架创建BigDogTcpModule模块,注册BigDogClientService服务,在WinForm和WPF中通过依赖注入获取服务实例,实现连接按钮功能,添加连接状态判断和错误提示,建立界面与服务层的交互机制。


本节继续完善客户端通信框架,在WinForm和WPF中引入通信模块,通过依赖注入方式集成大狗服务,添加界面按钮实现在线状态判断功能,讲解VS的快速操作技巧如接口提取和字段生成,为后续功能开发奠定基础。


本节深入完善客户端通信机制,核心内容包括:创建BigDogTcpClient类对TcpClient进行二次封装,实现更专业的通信架构,添加专属适配器配置,引入WaitHandlePool等待池组件实现请求响应的精确匹配,为一问一答通信模式打下基础。


本节设计并实现一问一答通信模式,通过TransactionID实现请求响应的精确对应,引入WaitHandlePool等待池机制支持并发请求,实现Ping业务作为示例,讲解异步等待机制和取消令牌的使用,完成基础通信框架的核心功能。


本节完善应答模式以支持响应数据,修改适配器数据结构从ByteBlock改回字节数组以简化开发,优化RequestInform支持Value属性携带响应数据,完善CreateResponse方法支持数据体传入,实现Ping响应返回实际数据的功能。


本节实现断线重连和界面通知功能,配置ReconnectionPlugin插件实现轮询式自动重连,通过AppMessenger消息机制实现服务器断线时的界面通知,创建TcpDisconnectPlugin插件处理断线事件,使用依赖注入方式在顶层注册消息服务,实现客户端自动维护连接状态。


本节优化断线消息通知机制,解决消息订阅的多播问题。设置AppMessenger的AllowMultipleRegistration属性为true支持多个订阅者,使用MessageToken令牌机制确保消息精确投递,解决多窗体同时订阅消息的场景,避免消息冲突和丢失。


本节实现用户登录通信逻辑,设计Login枚举标识和LoginRequest/LoginResponse数据模型,实现SetJsonValue方法支持对象序列化,在BigDogClientService中添加LoginAsync方法,实现账号密码的JSON序列化传输,为聊天系统的用户认证奠定基础。


本节在WinForm中实现登录界面,创建LoginForm窗体设计登录界面,通过依赖注入获取BigDogService调用登录API,实现登录成功后跳转到MainForm,添加登录失败的错误提示,修改程序启动入口从MainForm改为LoginForm。


本节在WPF中实现MVVM模式的登录功能,创建LoginWindow和LoginViewModel实现视图与逻辑分离,使用Grid布局设计登录界面,通过ICommand实现登录命令绑定,利用Messenger消息通知实现登录状态反馈,展示WPF的现代化开发模式。


本节实现客户端聊天通信功能,设计Chat枚举和ChatRequest/ChatResponse数据模型,在BigDogClientService中添加ChatAsync方法,实现消息发送时自动携带当前登录账号作为源账号,完善ResponseBase基类统一Success和Message属性,为聊天系统的消息传输建立通信机制。


本节实现服务器端消息队列转发机制,使用System.Threading.Channels创建无界Channel作为消息队列,接收聊天消息后写入队列而非直接转发,通过后台线程读取队列并转发消息,避免客户端接收线程被阻塞,设计ServerChat消息类型实现服务器主动推送,提升系统并发性能。


本节完善客户端消息接收机制,在BigDogTcpClient中区分响应消息和服务器主动推送消息,创建ServerChatPlugin插件处理服务器主动发来的聊天消息,通过AppMessenger发布OnServerChatArrived事件通知界面层,实现消息接收的解耦,为界面显示聊天内容做准备。


本节在WinForm中实现好友列表功能,设计GetFriendsList枚举和GetFriendsListResponse模型,在BigDogClientService中实现GetFriendsListAsync方法,使用泛型Result返回好友数组,添加刷新按钮手动获取在线好友列表,将好友列表绑定到ListBox控件显示。


本节在WPF中实现MVVM模式的好友列表功能,在MainViewModel中创建Friends属性和RefreshCommand命令,设计Grid布局实现左右分栏显示好友列表和聊天区域,使用ObservableCollection实现数据绑定自动刷新,通过CommandParameter传递界面元素数据,展示WPF数据绑定的强大功能。


本节完善客户端消息发送功能,在WinForm中实现选择好友并发送消息的逻辑,添加目标账号和消息内容的验证,在WPF中使用Command和CommandParameter实现消息发送,通过ElementName绑定TextBox的Text属性作为命令参数,完成双端聊天发送功能的开发。


本节完成聊天系统的消息接收显示功能,订阅OnServerChatArrived消息事件接收服务器推送的聊天消息,使用SwitchToMainThreadAsync切换到主线程更新界面,在WinForm的TextBox和WPF的ViewModel中显示聊天历史,修复插件未添加的Bug,完成WinForm和WPF双端聊天系统的基本功能。


本节设计文件传输架构,分析文件传输的请求响应流程,设计下载请求、文件信息响应、分块请求、分块响应、完成通知五步流程,讨论服务器推送和客户端拉取两种模式的优劣,决定采用客户端主动拉取模式实现分块下载,使用Stream接口提升跨平台兼容性。


本节实现文件分块下载的客户端逻辑,设计DownloadFileRequest/Response数据模型,在BigDogClientService中封装DownloadFileAsync方法接收Stream参数,实现请求文件信息获取文件长度,设计按32KB分块请求的循环逻辑,创建DownloadFileBlock请求模型携带起始位置和长度,为分块下载建立完整流程。


本节完善文件分块下载的客户端实现,在循环中请求每个文件块并验证响应,将接收到的文件块数据异步写入Stream,通过Start位置累加实现分块迭代,添加下载完成后的DownloadFileFinish请求通知服务器,讲解Result和Result泛型的隐式转换机制,完成客户端下载主体逻辑。


本节实现服务器端文件下载逻辑,创建BigDogServerDownloadPlugin专门处理下载请求,实现DownloadFile请求时判断文件是否存在并返回文件信息,在DownloadFileBlock请求中读取指定位置和长度的文件数据并返回,使用字典缓存FileStream避免重复打开文件,在DownloadFileFinish时释放文件流资源,完成服务器端下载功能。


本节测试并完善文件下载功能,在WinForm中创建DownloadForm窗体设计下载界面,通过IFormManager管理窗体创建,调用DownloadFileAsync方法传入FileStream和目标路径,实现本地文件保存,测试下载功能验证文件传输的正确性,修复启动配置和路径问题,完成端到端的文件下载功能演示。


本节实现下载进度和速度显示功能,在DownloadFileAsync方法中添加Func回调参数传递进度和速度,通过已下载字节除以文件总长度计算下载进度,使用ValueCounter组件按周期统计每秒下载的字节数作为速度,在界面上实时显示下载进度百分比和速度信息,提升用户体验。


本节总结整个项目并分析优化方向,总结下载功能的实现思路,指出上传功能实现类似。分析三大优化方向:性能提升方面需要优化内存分配和序列化方式,安全性方面建议使用SSL加密传输,应用场景拓展需要解决下载并发问题、文件流提前关闭和资源释放等缺陷,为实际生产应用提供改进思路。