C++服务开发入门指南
  • 序言
  • 前言
  • 一、一个简单的服务
    • 1 什么是服务
    • 2 服务可以用来做什么
    • 3 简单服务框架
  • 二、网络通信服务框架
    • 1 网络服务的基本概念
    • 2 增加监听端口
    • 3 处理客户端会话
    • 小结
  • 三、添加基础模块
    • 1 日志模块
    • 2 定时器
    • 3 事件机制
    • 4 线程池
    • 5 线程安全
    • 小结
  • 四、一个聊天服务
    • 1 需求描述及分析
    • 2 概要设计
    • 3 创建服务项目
    • 4 ClientUser实现
    • 5 RoomMgr实现
    • 6 ChatRoom实现
    • 7 RoomIDMgr实现
    • 小结
  • 五、测试、迭代及重构
    • 1 测试
    • 2 迭代
    • 3 重构
    • 4 版本号
  • 六、架构设计
    • 1 单点服务
    • 2 分布式服务
  • 七、部署及发布
    • 1 部署环境
    • 2 编译环境
    • 3 部署服务
    • 4 发布服务
  • 八、线上问题处理
    • 1 线上问题
    • 2 问题处理
  • 九、程序员的职业规划
    • 职业规划
Powered by GitBook
On this page
  • 1、项目背景
  • 2、整体框架
  • 3、业务流程
  • 4、模块设计
  1. 四、一个聊天服务

2 概要设计

Previous1 需求描述及分析Next3 创建服务项目

Last updated 2 years ago

概要设计的目的,是为了形成一个可行的技术方案,并评估方案实现过程中的难点和需要注意的地方,避免因方案选择错误导致后期返工

新人进行概要设计文档的编写,可以有效的梳理自己的思路,并且在评审环节由经验丰富的老员工查漏补缺,并提出一些改进意见。

概要设计应该包含项目背景,整体框架设计,关键业务的流程图,前后端消息协议,以及部分关键核心代码。

1、项目背景

前三章已经实现了一个简单的C++服务框架。

本项目需要在前面服务框架的基础上,实现一个聊天服务,并在此过程中,完善服务框架。

聊天服务的需求细节已经在第四章第一节中介绍和初步分析。

本节主要完成聊天室项目的概要设计。

2、整体框架

服务框架为保证其通用性,在本项目中以lib库和头文件的方式提供底层框架支持。

新建一个聊天服务,实现第一节中的业务需求。服务仅考虑单点部署。

调试过程中,需要新建几个客户端,用来和服务端进行消息连调,验证功能正确性。

消息头格式为HYHEADER,消息体编码格式为json。

每个消息定义一个消息id,客户端到服务端的上行消息为req,服务端到客户端的下行消息为ack,同一消息req id为定义的值,ack id为req id 或上一个值 0x8000(#define HY_ACK 0x8000)

如申请会话的消息id为101,对应服务端回复的消息id为 (101 | 0x8000)。

3、业务流程

申请会话ID :

REQ(Client->Server):RequestSessionID 消息ID 101,客户端连接到服务后发送,无需其他参数

ACK(Server->Client):消息为json字符串{"sesID":"1000012345"}

创建聊天室:

REQ:CreateRoom 消息ID 102,客户端获取会话id后发送,无需其他参数

ACK:成功返回房间ID {"status":0, "roomID":100001},失败返回对应错误码{"status":1}

status 状态定义:

0,成功,非0为创建失败;

1,未找到会话id,需要先申请会话id;

加入聊天室:

REQ:JoinRoom 消息ID 103,需要指定要加入的房间id {"roomID":100001}

ACK:返回加入状态,由消息头中wParam字段携带

0,加入成功

1,加入失败,聊天室未找到

2,加入失败,聊天室人数已达上限

获取我的聊天室:

REQ:GetMyRoom 消息ID 104,无需其他参数

ACK:返回聊天室列表{"Create":100001,"his":[100002,100001],"in":100001}

聊天室内发送消息:

REQ: SendMsg 消息ID 105 ,参数为聊天室id和消息内容{"msg":"this is the first msg"}

ACK: wParam返回发送状态,0成功,1失败,不在聊天室内

聊天室内获取房间内用户名单:

REQ:GetRoomUserList 消息ID 106,无需参数,如果没在聊天室内,则返回错误

ACK:wParam返回获取状态,0成功,消息体为用户昵称列表 {"users":["张三","李四"]}

1 失败,不在聊天室内

广播消息:

ACK: BroadcastMsg 消息ID 107, {"msg":"this is the first msg","sender":"张三"}

4、模块设计

我们需要一个类来管理聊天室房间,包括创建、查询、定期检查删除。

需要一个类用来分配房间ID,并且回收房间ID,房间ID为6位数,从100000-999999,共99w个。我们可以使用一个队列来维护ID。从队列头取ID,回收的ID放到队列尾部。

需要一个房间类,用于管理房间内部的信息,检测房间是否符合销毁的条件

设置一个客户端对象,保存用户信息

接下来,我们逐步实现相应功能。