默认
发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求MobileIMSDK的app移动端与MobileIMSDK-Web端互通问题
我的使用场景,APP与APP之间通信的数据都是通过服务器中的onTransBuffer_C2C_CallBack和onTransBuffer_C2C_RealTimeSendFaild_CallBack做历史消息和离线消息存储,现在增加一个WEB端,IM服务器开启了桥接开关,发现APP与WEB通信相互通信时,两端能够相互通信,但是APP发给WEB的消息在服务器的onTransBuffer_C2C_CallBack事件中无法捕获,DEBUG后,发现并没有触发该事件,WEB端给移动端发消息时,该事件是触发的,我需要该事件存储历史消息,请告知是啥原因和对应的解决方案,谢谢。

补充测试的结果:
两台APP和一个WEB终端,如果一个APP离线了,WEB端给离线的APP发消息可以通过onTransBuffer_C2C_RealTimeSendFaild_CallBack获得,但是在线的的另一个APP给离线的APP发送消息,onTransBuffer_C2C_RealTimeSendFaild_CallBack该事件无法获得,看日志显示如下
客户端4_4不在线,数据[from:1_1,fp:746B07CD-95CF-48B8-8B81-910648AA24B8to:4_4,content:fff ] 将通过MQ直发Web服务端(彼时在线则通过web实时发送、否则通过Web端进行离线存储)【第一阶段APP+WEB跨机通信算法】


开启桥接后,APP与APP通信的离线消息,如何存储。谢谢

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复]Android端同手机两应用一起使用则无法登录,提示:数据发送失败,代码3下一篇:[已解决] 求教 iOS 版MobileIMSDK在哪里知道发送的消息超时未成功送达的?

本帖已收录至以下技术专辑

推荐方案
评论 3
你的MobileIMSDK版本是多少?MobileIMSDK-Web的版本是多少?

你可以验证一下,当关闭桥接时,onTransBuffer_C2C_CallBack是否被调用。

另外,你需要做一个实验:
1)把服务端的log全部清空(也就是把服务端重启一下);
2)app端向另一个用户发送一条消息(注意只需要一条
3)抓出此时的app服务端的完整log、web服务端的完整log。

最后:你用上面同样的方法,把关闭桥接情况下的,app服务端完整log也贴出来,对比分析一下。

重要说明:以上实验时,仅发一条消息!否则log会太多,也就没有分析的价值了。

-------------------------------------------- 分隔线 --------------------------------------------

【普及一下MobileIMSDK和MobileIMSDK-Web桥接通信时的算法逻辑】

此时的算法逻辑是:当APP(简称A)向对方(简称B)发消息时,APP服务端收到A的消息发送请求后,如果对方(即B)不在APP端登陆时,APP服务端会无条件将消息通过桥接发给Web服务端,由Web服务端再来判断B用户是否在Web端登陆,此进如果B也不在web端登陆,则会触发web端的离线处理逻辑。

反之,当Web端给app发送消息时,也是这个逻辑。

简而言之:以上的算法逻辑是,当接收者不在这端时,无条件交给那边处理看看在不在线,如果那边还不在线,才真正进入离线处理。

算法这样做的好处是:可以省下一个全局用户状态维护机制(也就可以不用redis这样的东西了),整个算法、代码以及架构都会变的简单。

请理解以上算法思路!
版本号都是3.3,app与app通信,不管是否开启桥接,都在线时, 双方发消息都会通过onTransBuffer_C2C_CallBack该事件捕获,开启桥接时,有一个APP不在线,会自动转发至队列处理,如果转发至队列处理,如何捕获并存至数据库。还有APP给在线的WEB端发送信息,WEB端可以收到消息,但是onTransBuffer_C2C_CallBack该事件无法捕获,产生如下日志:


客户端9_9不在线,数据[from:1_1,fp:7BBFDCF3-532E-43B4-A04C-BD7AF2ECA649to:9_9,content:tug] 将通过MQ直发Web服务端(彼时在线则通过web实时发送、否则通过Web端进行离线存储)【第一阶段APP+WEB跨机通信算法】! | (GlobalSendHelper^sendDataC2C:78)
[INFO] - [15:01:58.264][IMMQ-↑] - [startPublisher()中] publish()成功了 !(数据:,q_app2web,{"bridge":false,"type":2,"dataContent":"tug","from":"1_1","to":"9_9","fp":"7BBFDCF3-532E-43B4-A04C-BD7AF2ECA649","QoS":true,"typeu":-1}) | (MQProvider^publish:420)
[DEBUG] - [15:01:58.265][IMCORE-netty<C2C>-桥接↑]>> 客户端{uid:1_1}/192.168.0.32:7801的数据已跨机器送出成功【OK】。(数据[from:1_1,fp:7BBFDCF3-532E-43B4-A04C-BD7AF2ECA649,to:9_9,content:tug]【第一阶段APP+WEB跨机通信算法】) | (GlobalSendHelper^sendDataC2C:98)
[DEBUG] - [15:01:58.267][IMCORE-netty<C2C>-桥接↑]【QoS_伪应答_C2S】向1_1发送7BBFDCF3-532E-43B4-A04C-BD7AF2ECA649的伪应答包成功,伪装from自:9_9【第一阶段APP+WEB跨机通信算法】. | (GlobalSendHelper$1^u
引用:孟素文@俺搜 发表于 2018-11-19 15:09
版本号都是3.3,app与app通信,不管是否开启桥接,都在线时, 双方发消息都会通过onTransBuffer_C2C_CallBa ...

你的问题实际上是两个问题,一个一个来,不要乱。

先讨论:这个问题“开启桥接时,有一个APP不在线,会自动转发至队列处理,如果转发至队列处理,如何捕获并存至数据库。

请看我在2楼的回复:“【普及一下MobileIMSDK和MobileIMSDK-Web桥接通信时的算法逻辑】”,也就是说:只要开启桥接,当你要发送的人不在app端时,app服务端会无条将消息送给web服务端,再由它接力判断是否在web端,经时如果web端还不在,才会认为这个人真不在线,则离线或其它后绪处理,将由web端来完成。

如果你不理解桥接通信为什么要这么干,那么你来思考一下:如果你来实现跨实例通信,你该怎么办?我说的是深入思考一下!然后,你就能懂了。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部