默认

[已解决] 修改MobileIMSDK代码后,Android客户端接收不到服务端下发的响应

查看数: 43899 | 评论数: 19 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-08-14 14:15

正文摘要:

首先说明下背景:    我修改了服务器端源码的一些内容,但是还是按照原来的框架来修改的,但是修改完毕后,发现能够正常的接收客户端发来的消息,而且IOS端暂未发现明显的问题,但是android客户端就出现 ...

评论

JackJiang 发表于 5 年前
引用:一叶知秋 发表于 2018-08-16 21:39
楼主谢谢你的,指点,我们目前确定的原因是我们客户端在初始化UI主界面初始化完成时,就调用了SDK的初始 ...

问题解决了就好
一叶知秋 发表于 5 年前
引用:JackJiang 发表于 2018-08-16 10:37
是你的代码用错了,错误在于你的SendLoginDataAsync类里 LocalUDPDataSendder.sendLogin方法的调用,以及 ...

楼主谢谢你的,指点,我们目前确定的原因是我们客户端在初始化UI主界面初始化完成时,就调用了SDK的初始化方法,导致SDK的线程被阻塞了,后来将其调用改为UI主线程初始化完成后执行,就没问题了。
JackJiang 发表于 5 年前
引用:一叶知秋 发表于 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 发表于 5 年前
引用:一叶知秋 发表于 2018-08-16 09:52
楼主,我是在这里监控的上有没有收到消息,我们这边出现的情况就是客户端在下发登录消息后,却收不到服务 ...

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

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

MobileIMSDK经过开源大量的使用,基本上不会出现你描述的问题,出的问题基本就是用法不对导致的,所以我想看到代码的原因就是确定你代码是否用对了。
JackJiang 发表于 5 年前
引用:一叶知秋 发表于 2018-08-15 10:14
这是服务端登录下发的截图,这个是基本是咱们开源源码的内容,我就在code那里加个值,来测试。

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

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

务必理解!如果不解的地方,你直接回贴。
JackJiang 发表于 5 年前
没看到你的代码,光看你描述没法知道具体情况
一叶知秋 发表于 5 年前
引用:JackJiang 发表于 2018-08-14 22:03
把im的login部分的代码贴出来,看看你是怎么判定登陆成功的

楼主,而且我用服务端源码给我们集成Android客户端下发消息也出现收不到的现象,而且如果我服务端打断点处于debug模式,客户端就能收到。但是除此之外,也有偶发的情况客户端能收到服务端下发的消息,但是大多数是收不到的。
一叶知秋 发表于 5 年前
我只是下发了登录的响应消息类型,但是我没试过其他的消息类型。这个明天可以一试。
一叶知秋 发表于 5 年前
代码在公司电脑,我就是把所有验证用户登录的逻辑都注释掉了,直接下发消息,但是截图的客户端版本就是收不到,但是采用源码的demo就没有任何问题。
JackJiang 发表于 5 年前
引用:一叶知秋 发表于 2018-08-14 21:50
目前这个是android的实现源码,如果需要服务端代码可以说下,发哪块的代码

把im的login部分的代码贴出来,看看你是怎么判定登陆成功的
一叶知秋 发表于 5 年前
客户端在服务端Debug断点之后能收到,这个原因可能出在哪里呢?怎么去排查下呢?
一叶知秋 发表于 5 年前
l楼主,是这样子,刚才帖子里说的那两个方法查看过了,我们是在LocalUDPDataReciever这个类里的p2pListeningImpl这个方法里打的Log,但是却看不到内容输出,试了除code为0之外的其他值也不行,我切换成未修改的版本也不行。而且有神奇的情况是客户端有可能会收到。
而且我本地服务器确定是下发下去了。
JackJiang 发表于 5 年前
引用:一叶知秋 发表于 2018-08-14 14:29
表面上看是这样,能问下android客户端的消息接收入口在哪里吗?

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

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

另外,你自已改动的什么代码,可以跟原版对比一下,贴出来看看,我帮你分析一下。
一叶知秋 发表于 5 年前
表面上看是这样,能问下android客户端的消息接收入口在哪里吗?
JackJiang 发表于 5 年前
你的意思是,只要是连接到IM服务端时服务端返回的code不为0你的android端就收不到这条响应?

返回顶部