头条不止是阅读,还有分享,更有IO币。可以兑换机械键盘、技术图书喔。 欢迎分享:http://toutiao.io/contribute 本文主要以Android客户端为例,记录了有赞旗下 App 中使用自研 IM SDK 设计思路,由有赞移动开发组 IM SDK 团队共同讨论完成。 背景在有赞产品中,存在大量需要交易双方沟通交流的场景,比如,客户咨询商家产品信息,售前售后简单的答疑和维权等。另外,有赞业务还存在一些特殊的复杂场景,如供应商,分销商,客户三方之间需要同步沟通,会同时存在多种沟通角色。此时需要较为完善的即时通信(IM)解决方案,但是由于有赞针对不同的商户和使用场景有多个APP,APP自行实现IM功能代价较大,且维护起来人力分散,于是,IM SDK 项目便应运而生了,APP 通过接入此SDK,可以快速实现IM基本功能。 设计目标
整体结构下图中简要描述了有赞客户端中IM系统的基本结构
设计要点此章节中主要描述了,IM SDK设计中一些重要流程。 Socket长连接的创建与维护IM SDK 所有数据收发流程,均通过Socket长连接完成,如何维护一个稳定Socket通道,是IM系统是否稳定的重要一环。 下面描述下Socket通道几个重要的流程
所以SDK封装isConnected()方法的时候,是根据这几种情况综合判断当前的通道状态,而不是仅仅通过Socket.isConnected()或者Socket.isClosed()。 消息发送流程消息发送流程主要有两大类,一类是IM相关数据的请求,例如:历史消息列表,会话列表等,另一类是IM消息的发送,主要是文字消息。(富媒体消息发送,会将富媒体文件先上传服务器后,拿到文件URL, 通过文字消息,将此URL发给接收方,接收方下载后进行UI展示)。 此两类消息发送,均使用上图的流程进行发送,可通过发送回调感知请求的结果。 如图所示,消息发送流程,需要先封装消息请求,在通过发送队列发送至服务器,发送前,在将请求id和对应回调存入本地Map数据结构中。 if (requestCallBack != null) {
mCallBackMap.put(requestId, requestCallBack);
}
之后接收服务器推送消息(此消息带有发送请求时的请求id),在本地的Map数据找到请求id对应的回调,然后通过回调返回服务器推送过来的数据。 private void IMResponseOnSuccess(String requestid, String response) {
if (mCallBackMap != null) {
IMCallBack callBack = mCallBackMap.get(requestid);
if (callBack == null) {
return;
}
if (callBack instanceof JsonResultCallback) {
final JsonResultCallback resultCallback = (JsonResultCallback) callBack;
if (resultCallback.mType == String.class) {
callBack.onResponse(response);
} else {
Object object = new Gson().fromJson(response, resultCallback.mType);
callBack.onResponse(object);
}
removeCallBack(requestid);
}
}
}
如下的示例中,展示了一个获取会话列表的请求,可以看出目前的请求封装,和一些第三方的的网络库类似,使用起来较为方便。 RequestApi requestApi = new RequestApi(IMConstant.REQ_TYPE_GET_CONVERSATION_LIST, EnumsManager.IMType.IM_TYPE_WSC.getRequestChannel());
requestApi.addRequestParams("limit", 100);
requestApi.addRequestParams("offset", 0);
IMEngine.getInstance().request(requestApi, new JsonResultCallback |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|