在上一课中我们详细地了解了从 Client 到 Broker 的连接建立,接下来看一下如何关闭连接。本节课核心内容:
- Client 主动关闭连接
- Broker 主动关闭连接
- 代码实践
3.1 Client 主动关闭连接
Client 主动关闭连接的流程非常简单,只需要向 Broker 发送一个 DISCONNECT 数据包就可以了。DISCONNECT 数据包没有可变头(Variable header)和消息体(Payload)。在 Client 发送完 DISCONNECT 之后,就可以关闭底层的 TCP 连接了,不需要等待 Broker 的回复(Broker 也不会对 DISCONNECT 数据包回复)。
这里读者可能有一个疑问,为什么需要在关闭 TCP 连接之前,发送一个和 Broker 没有交互的 DISCONNECT 数据包,而不是直接关闭底层的 TCP 连接?
这里涉及到 MQTT 协议的一个特性,Broker 需要判断 Client 是否正常地断开连接。
当 Broker 收到 Client 的 DISCONNECT 数据包的时候,它认为 Client 是正常地断开连接,那么它会丢弃当前连接指定的遗愿消息(Will Message)。如果 Broker 检测到 Client 连接丢失,