..
Client_server连接管理
对于一个客户端服务端通讯模型来说,客户端会与服务端进行实时通讯,接下来分析双端的业务逻辑逻辑。假设这里的通讯协议是成熟的,可以只关心通讯本身,而非 tcp 这种还要处理很多细节的基础协议。
Client 客户端
对于一个 Client–Server 通讯模型,客户端的职责可以抽象为三件事情:
- 建立并维护与服务端的连接
- 接收来自服务端的消息
- 向服务端发送消息
对于事件1来说,在事件1发生后,应该会在系统中产生两个状态,状态 C(Connect)意味着处于连接上,状态 D(Disconnect) 意味着断开连接。
必要模块和原因
1.连接模块
必要性:只有当连接成功后,消息传递才会发生;
逻辑依赖:无前置依赖逻辑;
模块必要动作:
- 连接动作:(在未连接状态)进行连接
- 心跳动作:(在连接状态)用来获取连接状态
2.接受数据模块
必要性:对于消息交互模型,接受数据是必要的;
逻辑依赖:需要连接模块保证连接状态为 C
模块必要动作:
- 最近一次心跳动作获取的状态为 C;
- 接收数据并获取接收数据的结果;
3.发送数据模块
必要性:对于消息交互模型,发送数据也是必要的;
逻辑依赖:需要连接模块保证连接状态为C
模块必要动作:
- 最近一次心跳动作获取状态为 C 方可执行发送数据动作;
- 获取发送数据动作的结果;
Server 服务端
对于一个服务端来说,需要做的就是以下 三件事情:
- 等待并接受客户端连接;
- 接收客户端发送的消息;
- 向客户端发送消息;
与 Client 一样,在事件 1(连接/断开)发生后,系统中同样会产生两个状态:
- 状态 C(Connect):至少存在一个已建立的有效连接
- 状态 D(Disconnect):不存在任何有效连接(或某一连接断开)
注意: Server 的 C / D 是“针对单个连接”成立的状态,而不是全局只有一个状态
必要模块与原因
1.连接管理模块
必要性:Server 只有在接受连接后,才能进行任何消息交互;Server 需要管理 多个 Client 连接;每个连接都必须有独立的生命周期和状态
逻辑依赖:无前置依赖逻辑(Server 的起点)
模块必要动作:
- 等待连接动作:监听新连接;接受连接请求
- 连接状态维护:为每个 Client 维护状态:C / D
- 连接清理:心跳超时 / 主动断开 → 状态切换为 D;释放资源
2.接收数据模块
必要性:Server 的业务逻辑完全由 Client 的请求驱动;没有接收,就不存在“服务”
逻辑依赖:必须依赖 连接模块;仅对状态为 C 的连接执行接收动作
模块必要动作:
- 检查连接状态:当前连接状态为 C
- 接收消息:接收来自 Client 的完整业务消息
- 触发业务处理:将消息交由业务逻辑层处理
3.发送数据模块
必要性:Server 需要对 Client 请求做出响应;Server 可能需要 主动推送消息(通知、广播等)
逻辑依赖:依赖连接模块;目标连接状态必须为 C
模块必要动作:
- 检查目标连接状态:仅对状态为 C 的连接发送数据
- 执行发送动作
- 获取发送结果:成功 → 正常结束;失败 → 标记连接异常,进入 D