跳转至

消息多终端漫游

1.概述

有度客户端支持消息漫游,消息记录在服务器和客户端都有保存;无论是手机、个人电脑等各种设备上,随时随地都能够完整地查看消息记录,这个特性是由一系列机制进行保证。

1.1.会话是什么

“会话”:相当于一个聊天室,用户选择人员发起聊天的时候就建立了一个会话。一个会话数据包含一些基础信息,如标题、会话ID(下文称SessionID)、成员列表、第一条消息ID(下文称FirstMsgID)、最后一条已读消息ID(下文称LastReadMsgID)、最大消息ID(下文称MaxMsgID)。

1.2.消息是什么

“消息”:顾名思义,一个消息数据包含消息ID(下文称MsgID)、消息内容、发送者等等。

2.客户端获取消息的流程

2.1.最近会话查询

客户端登录成功之后会先去服务器查询最近会话列表,根据列表中的会话数据刷新界面显示。

2.2.未读会话查询

未读会话的特点是MaxMsgID大于LastReadMsgID,之前查询的最近会话中可能会包含未读会话。客户端向服务器请求查询未读会话列表,并将查询到的会话数据与之前最近会话的数据合并,滤掉重复的,并进行排序,刷新界面显示。

2.3.查询最近消息

由于客户端会话列表上每个会话格子都会显示当前会话的最后一条消息,客户端会根据会话数据的MaxMsgID向服务器查询相应的消息数据,并将消息内容处理并显示到界面,同时为了让客户端打开会话浏览的过程更平滑,客户端实际上会查询最近25条消息,这样第一次打开会话的聊天窗口的时候能很快看到最近的聊天内容。

2.4.新消息查询

当用户收到新消息时,服务器会从tcp连接通道向客户端发送一条通知,通知中包含出现新消息的会话SessionID和会话最新消息的MsgID等,客户端根据SessionID和MsgID去服务器查询相关的消息数据,将内容处理并显示在界面上。

2.5.历史消息查询

当用户在客户端聊天窗口里上下翻阅的时候,就涉及到历史消息的查询了。由于MsgID是连续自增的,因此客户端可以根据会话的MaxMsgID推算出以前的消息ID,并根据FirstMsgID检查是否已经到了最早的一条。客户端根据用户查看到的位置自动查询批量向服务器查询消息数据,以便于平滑展示消息内容。

2.6.客户端会话和消息数据缓存

客户端每次查询到会话和消息数据之后会写到本地数据库中,以便于下次用户访问可以很快地展示出来,由于消息数据通常是不变的,因此如果客户端发现本地有存储某条消息数据,则不会再重新去服务器查询该消息数据,以减少流量消耗。

2.7.客户端消息空洞填充

举个例子在没打开会话的情况下, 消息都是只查询最后25条的,假设第一次打开应用,把MsgID区间为101-125的消息查询到了,断网后下次打开应用,最近消息的MsgID到了225,那么只会拉201-225,那么MsgID在126-200区间内的消息在客户端本地数据库是找不到的,这样就形成了消息空洞。目前客户端解决的方法是当用户翻阅查看历史消息时,预先向服务器请求查询查看位置附近可能缺失的消息数据以便于及时加载,保证用户能够顺利浏览。