默认
发表评论 9
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] mobileimsdk v3版 安卓,为什么登录上之后立即离线了?
 private void initImSdk() {
        //初始化imsdk
        Log.i("iiii", "登录页正在初始化im..");
        IMClientManager.getInstance(getApplicationContext()).initMobileIMSDK();

        ConfigEntity.serverIP = "127.0.0.1";//真实ip不是这个
        ConfigEntity.serverUDPPort = 7901;


    }

private void imLoginImpl(String id) {
        IMClientManager.getInstance(getApplicationContext()).getBaseEventListener()
                .setLoginOkForLaunchObserver(onLoginSucessObserver);
        new LocalUDPDataSender.SendLoginDataAsync(getApplicationContext() , id, "") {
/*
             * @param code 数据发送返回码,0 表示数据成功发出,否则是错误码
             */
            @Override
            protected void fireAfterSendLogin(int code) {
                if (code == 0) {
                    //
                    Toast.makeText(getApplicationContext(), "IM数据发送成功!", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "IM数据发送失败。错误码是:" + code + "!", Toast.LENGTH_SHORT).show();

                }
            }
        }.execute();

        onLoginSucessObserver = new Observer() {
            @Override
            public void update(Observable observable, Object data) {
                // * 已收到服务端登陆反馈则当然应立即取消显示登陆进度条
                // 服务端返回的登陆结果值
                int code = (Integer) data;

                if (code == 0) {
                    Log.i("iiii", "IM登录成功");
                } else {// 登陆失败
                    Log.e("iiii", "IM登录失败,错误码" + code);
                }
            }
        };
    }

服务器端大概日志如下

[2017-08-27 16:47:59] - [net.openmob.mobileimsdk.server.ServerCoreHandler] - [IMCORE]与{uid:null}/172.16.198.48:49882的会话建立(sessionCreated)了...
[INFO] - [2017-08-27 16:47:59] - [net.openmob.mobileimsdk.server.ServerCoreHandler] - [IMCORE]与{uid:null}/172.16.198.48:49882的会话(sessionOpened)打开了...
[INFO] - [2017-08-27 16:47:59] - [net.openmob.mobileimsdk.server.processor.LogicProcessor] - [IMCORE]>> 客户端{uid:null}/172.16.198.48:49882发过来的登陆信息内容是:loginInfo=240074|getToken=
[DEBUG] - [2017-08-27 16:47:59] - [com.aoliliya.im.service.server.ServerEventListenerImpl] - 正在进行用户登录验证:userId=240074,token=,extra=null,登录Ip=/172.16.198.48:49882
[DEBUG] - [2017-08-27 16:47:59] - [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton b
[DEBUG] - [2017-08-27 16:48:00] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为1...
[WARN] - [2017-08-27 16:48:00] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】指纹为90b0c213-d92c-451b-a3a1-003204a370e4的包距"刚刚"发出才509ms(<=2000ms将被认定是"刚刚"), 本次不需要重传哦.
[DEBUG] - [2017-08-27 16:48:05] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为1...
[DEBUG] - [2017-08-27 16:48:05] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】指纹为90b0c213-d92c-451b-a3a1-003204a370e4的消息包已成功进行重传,此次之后重传次数已达1(最多1次).
[DEBUG] - [2017-08-27 16:48:10] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为1...
[DEBUG] - [2017-08-27 16:48:10] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】指纹为90b0c213-d92c-451b-a3a1-003204a370e4的消息包重传次数已达1(最多1次)上限,将判定为丢包!
[WARN] - [2017-08-27 16:48:10] - [net.openmob.mobileimsdk.server.qos.QoS4SendDaemonRoot] - 【IMCORE-本机QoS】【QoS发送方】指纹为90b0c213-d92c-451b-a3a1-003204a370e4的消息已成功从发送质量保证队列中移除(可能是收到接收方的应答也可能是达到了重传的次数上限),重试次数=1
[DEBUG] - [2017-08-27 16:48:10] - [com.aoliliya.im.service.server.MessageQoSEventS2CListnerImpl] - 【DEBUG_QoS_S2C事件】收到系统的未实时送达事件通知,当前共有1个包QoS保证机制结束,判定为【无法实时送达】!
[INFO] - [2017-08-27 16:48:10] - [net.openmob.mobileimsdk.server.ServerCoreHandler] - [IMCORE]与{uid:240074}/172.16.198.48:49882的会话关闭(user_id=240074)了...
[DEBUG] - [2017-08-27 16:48:10] - [com.aoliliya.im.service.server.ServerEventListenerImpl] - 【DEBUG_回调通知OnUserLogoutAction_CallBack】用户:240074 离线了!
[DEBUG] - [2017-08-27 16:48:23] - [org.springframework.session.data.redis.RedisOperationsSessionRepository] - Publishing SessionDestroyedEvent for session 8aacb474-75eb-4a2e-978e-65917068140c
[DEBUG] - [2017-08-27 16:48:32] - [org.springframework.session.data.redis.RedisOperationsSessionRepository] - Publishing SessionDestroyedEvent for session f953280a-d738-43fa-9098-3090d29b3467


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

上一篇:[已回复] MobileIMSDK在android运行时IP换成公司的后无法收到请求下一篇:[已回复] iOS苹果机上的mobileimsdk v3版内存占用过高怎么优化?

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

推荐方案
评论 9
引用:kelefun 发表于 2017-08-28 16:14
我好像把这个帖子发错版块了,应该发到moileImSdk里,而不是mobileImSdk-Web版块.
版主能挪过去吗?

已挪
我好像把这个帖子发错版块了,应该发到moileImSdk里,而不是mobileImSdk-Web版块.
版主能挪过去吗?

其实我把初始化方法从creatView挪到登录点击事件里是为了解决另外一个小坑
就是--
如果初始化方法放到createView里,那么退出登录(调用doLoginOut)回到登录页面(不退出app)  切换账号,
那么再登录会导致203错误(不是因为没调用resetInitFlag())
,是因为doLoginOut是个异步的,登出还没执行完,登录页面的初始化方法就开始执行了.


现在解决了,应该就是这个问题,初始化SDK与登录的两个方法放到一起,初始化没执行完就登录,导致服务器的确认机制失败.然后下线了
引用:kelefun 发表于 2017-08-28 15:22
明白了,谢谢回复.

解决了吗
引用:JackJiang 发表于 2017-08-28 10:02
是的,Android版上的这个initMobileIMSDK()很关键,尽量放到onCreate方法里调用,原因是MobileIMSDK需要 ...

明白了,谢谢回复.
引用:kelefun 发表于 2017-08-28 09:06
ip是我发帖才手动改的,为了隐藏我的真实ip而已.  日志确实对应这段代码,,,而且是v3版.我是按照demo写的, ...

是的,Android版上的这个initMobileIMSDK()很关键,尽量放到onCreate方法里调用,原因是MobileIMSDK需要注册Android的网络变动事件,而Android的网络变动事件在系统层面的优先级很低,导致事件收到可能存在一些延迟(虽然对于人来说几十几百毫秒无所谓,但对于代码来说当你在此之后立即调用的代码肯定就是在事件注册好之前调用了,而期望的是在事件注册后调用)。

具体情况你看下这个事件里的代码在干什么就明白了,而且android的app还有一个现象,也就是你的app每次启动时都会自动触发这个事件一次,即使当前网络并没有变动的情况下。

其实,说了这么多,可能只有针对代码你才能真正理解,我猜想你最可能的原因就是在本地端口监听正常工作前,你就提交了登陆请求,导致后绪服务端发过来的心跳反馈你都无法收到而导致的。所以你把initMobileIMSDK()方法尽量可能优先调用。

其实这个方法的调用我已经API 文档里特别注明了(见ClientCoreSDK.init()):
[已回复] mobileimsdk v3版 安卓,为什么登录上之后立即离线了?_QQ20170828-100959@2x.jpg

而上图中提到的技术备忘文字如下,不知是否对你的理解有帮助:
[已回复] mobileimsdk v3版 安卓,为什么登录上之后立即离线了?_QQ截图20170828101157.png
引用:JackJiang 发表于 2017-08-27 22:10
代码里你的服务器ip是:127.0.0.1,而客户端又是android版,那意味站你手机上跑服务端?这不合逻辑。 这样 ...

ip是我发帖才手动改的,为了隐藏我的真实ip而已.  日志确实对应这段代码,,,而且是v3版.我是按照demo写的,是github上修复203bug版本的demo.

问题是不是我把初始化方法放在登录按钮事件里了?initMobileIMSDK()一定要放在viewCreate内吗?
不能点击登录按钮后再初始化,然后直接调用登录实现吗?
代码里你的服务器ip是:127.0.0.1,而客户端又是android版,那意味站你手机上跑服务端?这不合逻辑。 这样来看你贴的日志跟你的代码根本对不上呢。。。

建议你用官方的Demo部署到你的服务器,用你现在的客户端来验证,先排险代码问题,看看客户端和服务器是否则能够双向通信,排查网络配置问题。

另外,请确保你的客户端跟服务端都得是MobileIMSDK v3版,因为v3版改动较大,跟v2版已不兼容,具体请去看看MobileIMSDK v3的更新说明。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部