默认
发表评论 19
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] 修改MobileIMSDK代码后,Android客户端接收不到服务端下发的响应
首先说明下背景:
   我修改了服务器端源码的一些内容,但是还是按照原来的框架来修改的,但是修改完毕后,发现能够正常的接收客户端发来的消息,而且IOS端暂未发现明显的问题,但是android客户端就出现接收不到服务器响应的消息内容,奇怪的是,再有未收到回执再次下发的机制保证下,正常的登录响应消息,Android客户端可以收到(即code为0),但是返回code不为0的情况就收不到,这个我试过未修改前的版本,那个可以正常的发送接收。不晓得是哪里出了问题?而且我看线程信息和未修改前的也是一致的,底层发送结果也是一致的。很奇怪,而且android客户端那边就是出于阻塞状态收不到消息。
贴上接收不到的消息:
{"type":50,"content":"{\"code\":302}","from":"0","to":"9764777","fp":"55528afb-e1f9-471a-a5da-c9bc843d63a9","QoS":true,"typeu":-1}
贴上能收到的消息:
{"type":50,"content":"{\"code\":0}","from":"0","to":"9764777","fp":"2fea93dd-004f-4081-836f-07c7edc1f9be","QoS":true,"typeu":-1}

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

标签:MobileIMSDK
上一篇:[已回复] 怎么获取到MobileIMSDK用户登录成功的返回值问题下一篇:[已解决] 求教MobileIMSDK开发的im的登陆问题

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

推荐方案
评论 19
你的意思是,只要是连接到IM服务端时服务端返回的code不为0你的android端就收不到这条响应?
表面上看是这样,能问下android客户端的消息接收入口在哪里吗?
引用:一叶知秋 发表于 2018-08-14 14:29
表面上看是这样,能问下android客户端的消息接收入口在哪里吗?

MobileIMSDK的Andorid端消息接收是在这两个回调接口里实现的:
ChatBaseEvent
ChatTransDataEvent

你查一下你工程里这两个类的子类,或者读一下原版Demo里的代码。

另外,你自已改动的什么代码,可以跟原版对比一下,贴出来看看,我帮你分析一下。
l楼主,是这样子,刚才帖子里说的那两个方法查看过了,我们是在LocalUDPDataReciever这个类里的p2pListeningImpl这个方法里打的Log,但是却看不到内容输出,试了除code为0之外的其他值也不行,我切换成未修改的版本也不行。而且有神奇的情况是客户端有可能会收到。
而且我本地服务器确定是下发下去了。
客户端在服务端Debug断点之后能收到,这个原因可能出在哪里呢?怎么去排查下呢?
目前这个是android的实现源码,如果需要服务端代码可以说下,发哪块的代码

粘贴图片(1).png (194.85 KB, 下载次数: 2304)

android初始化1

android初始化1

粘贴图片.png (123.67 KB, 下载次数: 2323)

粘贴图片.png
引用:一叶知秋 发表于 2018-08-14 21:50
目前这个是android的实现源码,如果需要服务端代码可以说下,发哪块的代码

把im的login部分的代码贴出来,看看你是怎么判定登陆成功的
代码在公司电脑,我就是把所有验证用户登录的逻辑都注释掉了,直接下发消息,但是截图的客户端版本就是收不到,但是采用源码的demo就没有任何问题。
我只是下发了登录的响应消息类型,但是我没试过其他的消息类型。这个明天可以一试。
引用:JackJiang 发表于 2018-08-14 22:03
把im的login部分的代码贴出来,看看你是怎么判定登陆成功的

楼主,而且我用服务端源码给我们集成Android客户端下发消息也出现收不到的现象,而且如果我服务端打断点处于debug模式,客户端就能收到。但是除此之外,也有偶发的情况客户端能收到服务端下发的消息,但是大多数是收不到的。
没看到你的代码,光看你描述没法知道具体情况
引用:JackJiang 发表于 2018-08-15 09:28
没看到你的代码,光看你描述没法知道具体情况

这是服务端登录下发的截图,这个是基本是咱们开源源码的内容,我就在code那里加个值,来测试。

QQ截图20180815101301.png (58.91 KB, 下载次数: 2298)

QQ截图20180815101301.png
引用:一叶知秋 发表于 2018-08-15 10:14
这是服务端登录下发的截图,这个是基本是咱们开源源码的内容,我就在code那里加个值,来测试。

你没有贴客户端的代码,但我猜测应该是你们没有理解客户端登陆请求的响应是个异步返回的过程。

你仔细读一下这个帖子里的讨论:
[已回复] 怎么获取到MobileIMSDK用户登录成功的返回值问题》,尤其是我在5楼的回复,你仔细研究一下我图上那一段的含义。

务必理解!如果不解的地方,你直接回贴。
引用:JackJiang 发表于 2018-08-15 16:30
你没有贴客户端的代码,但我猜测应该是你们没有理解客户端登陆请求的响应是个异步返回的过程。

你仔细 ...

楼主,我是在这里监控的上有没有收到消息,我们这边出现的情况就是客户端在下发登录消息后,却收不到服务端下发的回执!!可能和你预料的有些出入,不知道我们这块应该如何确定问题呢?

粘贴图片(2).png (86.98 KB, 下载次数: 2292)

粘贴图片(2).png
引用:一叶知秋 发表于 2018-08-16 09:52
楼主,我是在这里监控的上有没有收到消息,我们这边出现的情况就是客户端在下发登录消息后,却收不到服务 ...

按照我的要要求,把代码贴出来我帮你看看。你看到的东西跟我看到的是不一样的。回了这么多条贴,你基本上没有贴出我想看到的代码。

我想看到的是:
1)登陆代码完整逻辑(完整的,不要只贴那眼屎大的一块);
2)网络回调代码的实现和设置(就是ChatBaseEvent、ChatTransDataEvent子类你们的实现代码以及怎么设置它们的)。

MobileIMSDK经过开源大量的使用,基本上不会出现你描述的问题,出的问题基本就是用法不对导致的,所以我想看到代码的原因就是确定你代码是否用对了。
引用:JackJiang 发表于 2018-08-16 10:06
按照我的要要求,把代码贴出来我帮你看看。你看到的东西跟我看到的是不一样的。回了这么多条贴,你基本上 ...

楼主这是所有的客户端有关初始化和登录的代码,你看下可以吗?

初始化6.png (188.54 KB, 下载次数: 2285)

初始化6.png

初始化5.png (70.07 KB, 下载次数: 2263)

初始化5.png

初始化4.png (88.66 KB, 下载次数: 2241)

初始化4.png

初始化3.png (6.48 KB, 下载次数: 2272)

初始化3.png

初始化实现1.png (66.6 KB, 下载次数: 2293)

初始化实现1.png

sdk调用初始化.png (138.38 KB, 下载次数: 2526)

sdk调用初始化.png
引用:一叶知秋 发表于 2018-08-16 10:19
楼主这是所有的客户端有关初始化和登录的代码,你看下可以吗?

是你的代码用错了错误在于你的SendLoginDataAsync类里 LocalUDPDataSendder.sendLogin方法的调用,以及LocalUDPDataReceiver.startup方法的调用。 MobileIMSDK的算法其实并不是你看到的这么简单,如果你完全读懂它的算法的话,它其实是有上下文关系的,并不是这么调用两下就搞定了底层框架的登陆。这种复杂性不是MobileIMSDK本身导致的,这是异步网络通信的复杂性带来的。

总之:你如果想解决问题,就放弃你这个类里的代码实现(你以为是对的,其实是错的),一定要严格按照Demo里的登陆处理代码和逻辑来实现,也就是用LocalUDPDataSender.SendLoginDataAsync这个类来实现。至于为什么要这么用,你先不用理会,直接按照我的方法,如果问题解决了,你再回头了仔细体会我让你调用的代码跟你自已的实现的细微区别在那里。

你参考demo里的登陆实现代码,尤其是下面这一段:
/**
         * 真正的登陆信息发送实现方法。
         */
        private void doLoginImpl()
        {
                // * 立即显示登陆处理进度提示(并将同时启动超时检查线程)
                onLoginProgress.showProgressing(true);
                // * 设置好服务端反馈的登陆结果观察者(当客户端收到服务端反馈过来的登陆消息时将被通知)
                IMClientManager.getInstance(this).getBaseEventListener()
                        .setLoginOkForLaunchObserver(onLoginSucessObserver);
                                
                // 异步提交登陆id和token
                new LocalUDPDataSender.SendLoginDataAsync(
                                LoginActivity.this
                                , editLoginName.getText().toString().trim()
                                , editLoginPsw.getText().toString().trim())
                {
                        /**
                         * 登陆信息发送完成后将调用本方法(注意:此处仅是登陆信息发送完成
                         * ,真正的登陆结果要在异步回调中处理哦)。
                         * 
                         * @param code 数据发送返回码,0 表示数据成功发出,否则是错误码
                         */
                        @Override
                        protected void fireAfterSendLogin(int code)
                        {
                                if(code == 0)
                                {
                                        //
                                        Toast.makeText(getApplicationContext(), "数据发送成功!", Toast.LENGTH_SHORT).show();
                                        Log.d(MainActivity.class.getSimpleName(), "登陆/连接信息已成功发出!");
                                }
                                else
                                {
                                        Toast.makeText(getApplicationContext(), "数据发送失败。错误码是:"+code+"!", Toast.LENGTH_SHORT).show();
                                        
                                        // * 登陆信息没有成功发出时当然无条件取消显示登陆进度条
                                        onLoginProgress.showProgressing(false);
                                }
                        }
                }.execute();
        }

特别注意:上面这段demo里的登陆代码,你需要关注onLoginSucessObserver这个观察者的用法,因为通信的响应是异步回来的,登陆成功或失败是通过这个观察者来监听的,你仔细研究!
引用:JackJiang 发表于 2018-08-16 10:37
是你的代码用错了,错误在于你的SendLoginDataAsync类里 LocalUDPDataSendder.sendLogin方法的调用,以及 ...

楼主谢谢你的,指点,我们目前确定的原因是我们客户端在初始化UI主界面初始化完成时,就调用了SDK的初始化方法,导致SDK的线程被阻塞了,后来将其调用改为UI主线程初始化完成后执行,就没问题了。
引用:一叶知秋 发表于 2018-08-16 21:39
楼主谢谢你的,指点,我们目前确定的原因是我们客户端在初始化UI主界面初始化完成时,就调用了SDK的初始 ...

问题解决了就好
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部