2 概要设计
Last updated
Last updated
概要设计的目的,是为了形成一个可行的技术方案,并评估方案实现过程中的难点和需要注意的地方,避免因方案选择错误导致后期返工
新人进行概要设计文档的编写,可以有效的梳理自己的思路,并且在评审环节由经验丰富的老员工查漏补缺,并提出一些改进意见。
概要设计应该包含项目背景,整体框架设计,关键业务的流程图,前后端消息协议,以及部分关键核心代码。
前三章已经实现了一个简单的C++服务框架。
本项目需要在前面服务框架的基础上,实现一个聊天服务,并在此过程中,完善服务框架。
聊天服务的需求细节已经在第四章第一节中介绍和初步分析。
本节主要完成聊天室项目的概要设计。
服务框架为保证其通用性,在本项目中以lib库和头文件的方式提供底层框架支持。
新建一个聊天服务,实现第一节中的业务需求。服务仅考虑单点部署。
调试过程中,需要新建几个客户端,用来和服务端进行消息连调,验证功能正确性。
消息头格式为HYHEADER,消息体编码格式为json。
每个消息定义一个消息id,客户端到服务端的上行消息为req,服务端到客户端的下行消息为ack,同一消息req id为定义的值,ack id为req id 或上一个值 0x8000(#define HY_ACK 0x8000)
如申请会话的消息id为101,对应服务端回复的消息id为 (101 | 0x8000)。
申请会话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":"张三"}
我们需要一个类来管理聊天室房间,包括创建、查询、定期检查删除。
需要一个类用来分配房间ID,并且回收房间ID,房间ID为6位数,从100000-999999,共99w个。我们可以使用一个队列来维护ID。从队列头取ID,回收的ID放到队列尾部。
需要一个房间类,用于管理房间内部的信息,检测房间是否符合销毁的条件
设置一个客户端对象,保存用户信息
接下来,我们逐步实现相应功能。