# ClientServerSocket **Repository Path**: leil1230/ClientServerSocket ## Basic Information - **Project Name**: ClientServerSocket - **Description**: 一款基于SuperSocket、Protobuf的C/S架构消息通信框架 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 3 - **Created**: 2020-05-11 - **Last Updated**: 2022-07-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ClientServerSocket #### 介绍 一款基于SuperSocket的C/S架构消息通信框架,客户端目前有WPF版本,消息序列化使用Google.Protobuf。WPF客户端集成Prism实现MVVM视图逻辑分离模式。 #### 软件架构 采用消息驱动模式架构,Server端实现消息驱动业务逻辑,Client端实现消息驱动UI逻辑。 ![框架结构](https://images.gitee.com/uploads/images/2020/0514/114723_a99f6839_679144.png "Frame.png") ![消息流向](https://images.gitee.com/uploads/images/2020/0514/114804_5f130dce_679144.png "ClientServerMessage.png") #### 安装教程 1. 使用git客户端clone代码 ``` git clone https://gitee.com/leil1230/ClientServerSocket.git ``` 2. Visual Studio打开解决方案,重新生成Client和Server项目 3. 运行Server和Client项目即可 #### 使用说明 1. 进入`protobuf/proto`文件夹按照需求编辑自己的proto文件,定义消息体结构 2. 在`protobuf`文件夹下,用命令基于proto文件生成C#代码 ``` #基于common.proto生成代码 protoc.exe --proto_path=proto --csharp_out=gen common.proto ``` 3. 将生成的C#代码文件拷贝到项目`proto`目录下 4. 在`Client.Constant.MessageId.class`类下添加定义的消息号 5. 客户端创建使用消息流程 >在`Message目录`下新建自己的消息。 >① 如果是请求消息,则继承`RequestBaseMessage`并且重写`Serialize()`方法,`Serialize()`方法中自定义消息序列化的逻辑。 ``` class GetUserInfoMsg : RequestBaseMessage { public GetUserInfoMsg(int msgId) : base(msgId) { } public string Name { get; set; } public override byte[] Serialize() { GetUserInfo getUserInfo = new GetUserInfo(); if (Name == null) { Name = ""; } getUserInfo.Name = Name; return getUserInfo.ToByteArray(); } } ``` >②如果是回复消息,则继承`ResponseBaseMessage`并且添加`MessageAttr`属性,重写`Deserialize()`方法,`Deserialize()`中自定义消息反序列化的逻辑。 ``` [MessageAttr(MessageId.USER_INFO_RESP)] class UserInfoRespMsg : ResponseBaseMessage { public List Users { get; } = new List(); public override void Deserialize(byte[] buffer) { UserInfoResp msg = UserInfoResp.Parser.ParseFrom(buffer); foreach (User user in msg.Users) { Users.Add(user); } } } ``` 6. 服务端创建消息流程和客户端相似,参考客户端创建方式即可 7. 客户端注册消息事件的方式 >定义消息事件方法,订阅消息事件 ``` // 定义消息处理事件委托 public void UserInfoResponse(ResponseBaseMessage message) { // TO DO // 消息操作 } // 订阅对应的消息事件即可 MessageEventPublisher.SubscribeEvent(MessageId.USER_INFO_RESP, UserInfoResponse); ``` 8. 服务端消息处理器 >在服务端`Processor`目录下新建自己的处理器,实现`IProcessor`接口,并且添加`ProcessorAttr`属性,实现`Process()`方法 ``` [ProcessorAttr(MessageId.GET_USER_INFO)] class GetUserInfoProcessor : IProcessor { public void Process(ProtobufAppSession session, RequestBaseMessage message) { // TO DO // 实现后端自定义消息处理逻辑 } } ``` 9. 客户端Prism开发MVVM请参考 [MVVM入门与提高](https://www.bilibili.com/video/BV1ht411e7Fe?from=search&seid=8659789397189098413)