默认
发表评论 15
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
APP自动重启再自动登录的功能,会偶尔出现被服务器判断为未登录的问题
阅读(51752) | 评论(15 收藏 淘帖
在做app自动重启再自动登录的功能,会偶尔出现被服务器判断为未登录。请问这问题该如何解决?
服务器输出日志里面表明了app登录成功了,但是后面又输出日志说已经掉线。然后就再也没有上线,得手动关掉app再打开才正常

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

上一篇:微信团队分享:微信Android版小视频编码填过的那些坑下一篇:腾讯团队分享:一次手Q聊天界面中图片显示bug的追踪过程分享
推荐方案
评论 15
你的是Android吗?Android系统是什么版本?手机型号是什么?你说的是MobileIMSDK?
看看这些问题,你一个都没有指明,问问题的艺术哦
引用:JackJiang 发表于 2017-11-02 19:44
你的是Android吗?Android系统是什么版本?手机型号是什么?你说的是MobileIMSDK?
看看这些问题,你一个 ...

app使用的是安卓sdk版本21,MobileIMSDK所有的用到的包应该是上个礼拜从git上下载的。手机用的海马玩模拟器,模拟器的安卓是4.3
引用:ving0099 发表于 2017-11-03 13:58
app使用的是安卓sdk版本21,MobileIMSDK所有的用到的包应该是上个礼拜从git上下载的。手机用 ...

以真机测试为准,尽量别用模拟器,Android的模拟器是除了开发工具IDE外的另一个垃圾,因为根真机相比没有可参考意义,顶多在没有手机的时候应个急。
引用:JackJiang 发表于 2017-11-03 14:10
以真机测试为准,尽量别用模拟器,Android的模拟器是除了开发工具IDE外的另一个垃圾,因为根真机相比没有 ...

我尝试用了真机调试,华为的荣耀note8 ,安卓系统是7.0的,一样的情况。发送消息控制app重启后,会偶尔出现im登录后又判断未下线的情况。表现是一样的,服务器日志输出app上线了,然后过了几秒又判断成下线了,就再也发不了信息过去。
我的app重启代码如下:
/**开启一个新的服务,用来重启本APP*/
                Intent intent1=new Intent(context,KillSelfService.class);
                intent1.putExtra("PackageName",context.getPackageName());
                intent1.putExtra("Delayed",5000);
                context.startService(intent1);

                /**杀死整个进程**/
                android.os.Process.killProcess(android.os.Process.myPid());

KillSelfService 里面:
/***
* 该服务只用来让APP重启,生命周期也仅仅是只是重启APP。重启完即自我杀死
*/
public class KillSelfService extends Service {
    /**关闭应用后多久重新启动*/
    private static  long stopDelayed=2000;
    private Handler handler;
    private String PackageName;
    public KillSelfService() {
        handler=new Handler();
    }

    @Override
    public int onStartCommand(final Intent intent, int flags, int startId) {
        stopDelayed=intent.getLongExtra("Delayed",2000);
        PackageName=intent.getStringExtra("PackageName");
        handler.postDelayed(new Runnable() {
                        public void run() {
                                 Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(PackageName);
                                 //重新启动app
                        startActivity(LaunchIntent);
                        KillSelfService.this.stopSelf();
                               
                        }
                },stopDelayed);
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public IBinder onBind(Intent intent) {
       return null;
    }

}
引用:ving0099 发表于 2017-11-03 15:00
我尝试用了真机调试,华为的荣耀note8 ,安卓系统是7.0的,一样的情况。发送消息控制app重启后,会偶尔出 ...

服务器日志:
89860000191707072527 是我的app的账户id
xuanweiinfo_server 是发送消息的id,这个我是发完就断掉的,所以会离线,不用管

第一次登录:
{"afstatus":"1","data":{"iccid":"89860000191707072527"},"iccid":"","method":"de.regDev","txdate":1509692547129}
[INFO] - [15:02:14.725][IMCORE]与{uid:null}/10.1.1.190:49650的会话建立(sessionCreated)了... | (ServerCoreHandler^sessionCreated:301)
[INFO] - [15:02:14.726][IMCORE]与{uid:null}/10.1.1.190:49650的会话(sessionOpened)打开了... | (ServerCoreHandler^sessionOpened:314)
[INFO] - [15:02:14.731][IMCORE]>> 客户端{uid:null}/10.1.1.190:49650发过来的登陆信息内容是:loginInfo=89860000191707072527|getToken=123456 | (LogicProcessor^processLogin:206)
[DEBUG] - [15:02:14.732]【DEBUG_回调通知】正在调用回调方法:OnVerifyUserCallBack...(extra=null) | (ServerEventListenerImpl^onVerifyUserCallBack:55)
[DEBUG] - [15:02:14.734]【@】当前在线用户共(1)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [15:02:14.734]【IM_回调通知OnUserLoginAction_CallBack】用户:89860000191707072527 上线了! | (ServerEventListenerImpl^onUserLoginAction_CallBack:73)
[INFO] - [15:02:14.822][IMCORE]>> 收到客户端{uid:89860000191707072527}/10.1.1.190:49650的ACK应答包发送请求. | (ServerCoreHandler^messageReceived:155)
[DEBUG] - [15:02:14.823][IMCORE-本机QoS!]【QoS机制_S2C】收到接收者89860000191707072527回过来的指纹为ffe685d1-ad87-4f12-b838-6f8c9e9995b5的应答包. | (LogicProcessor^processACK:146)
[DEBUG] - [15:02:14.823]【DEBUG_QoS_S2C事件】收到对方已收到消息事件的通知,fp=ffe685d1-ad87-4f12-b838-6f8c9e9995b5 | (MessageQoSEventS2CListnerImpl^messagesBeReceived:49)
[WARN] - [15:02:14.823]【IMCORE-本机QoS】【QoS发送方】指纹为ffe685d1-ad87-4f12-b838-6f8c9e9995b5的消息已成功从发送质量保证队列中移除(可能是收到接收方的应答也可能是达到了重传的次数上限),重试次数=0 | (QoS4SendDaemonRoot^remove:393)
[DEBUG] - [15:03:12.420]【IMCORE-本机QoS】【QoS接收方】++++++++++ START 暂存处理线程正在运行中,当前长度0. | (QoS4ReciveDaemonRoot^doTaskOnece:105)
[DEBUG] - [15:03:12.420]【IMCORE-本机QoS】【QoS接收方】++++++++++ END 暂存处理线程正在运行中,当前长度0. | (QoS4ReciveDaemonRoot^doTaskOnece:142)


重启后:
[INFO] - [15:03:46.648][IMCORE]与{uid:null}/127.0.0.1:61248的会话建立(sessionCreated)了... | (ServerCoreHandler^sessionCreated:301)
[INFO] - [15:03:46.649][IMCORE]与{uid:null}/127.0.0.1:61248的会话(sessionOpened)打开了... | (ServerCoreHandler^sessionOpened:314)
[INFO] - [15:03:46.650][IMCORE]>> 客户端{uid:null}/127.0.0.1:61248发过来的登陆信息内容是:loginInfo=xuanweiinfo_server|getToken=123456 | (LogicProcessor^processLogin:206)
[DEBUG] - [15:03:46.650]【DEBUG_回调通知】正在调用回调方法:OnVerifyUserCallBack...(extra=null) | (ServerEventListenerImpl^onVerifyUserCallBack:55)
[DEBUG] - [15:03:46.651]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [15:03:46.652]【IM_回调通知OnUserLoginAction_CallBack】用户:xuanweiinfo_server 上线了! | (ServerEventListenerImpl^onUserLoginAction_CallBack:73)
[INFO] - [15:03:46.701][IMCORE]>> 收到客户端{uid:xuanweiinfo_server}/127.0.0.1:61248的ACK应答包发送请求. | (ServerCoreHandler^messageReceived:155)
[DEBUG] - [15:03:46.702][IMCORE-本机QoS!]【QoS机制_S2C】收到接收者xuanweiinfo_server回过来的指纹为fe748b97-46af-4f45-93ee-fad205daec62的应答包. | (LogicProcessor^processACK:146)
[DEBUG] - [15:03:46.703]【DEBUG_QoS_S2C事件】收到对方已收到消息事件的通知,fp=fe748b97-46af-4f45-93ee-fad205daec62 | (MessageQoSEventS2CListnerImpl^messagesBeReceived:49)
[WARN] - [15:03:46.703]【IMCORE-本机QoS】【QoS发送方】指纹为fe748b97-46af-4f45-93ee-fad205daec62的消息已成功从发送质量保证队列中移除(可能是收到接收方的应答也可能是达到了重传的次数上限),重试次数=0 | (QoS4SendDaemonRoot^remove:393)
[INFO] - [15:03:47.666][IMCORE]>> 收到客户端{uid:xuanweiinfo_server}/127.0.0.1:61248的通用数据发送请求. | (ServerCoreHandler^messageReceived:169)
[DEBUG] - [15:03:47.666]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [15:03:47.668]【DEBUG_回调通知】[typeu=-1]收到了客户端xuanweiinfo_server发给客户端89860000191707072527的消息:str={"afstatus":"1","data":{"force":"1"},"method":"sys.reboot","txdate":1509692627563,"uid":"88914A39F4604FE8876A4678F53FE214"} | (ServerEventListenerImpl^onTransBuffer_C2C_CallBack:129)
[INFO] - [15:03:47.799][IMCORE]>> 收到客户端{uid:89860000191707072527}/10.1.1.190:49650的ACK应答包发送请求. | (ServerCoreHandler^messageReceived:155)
[DEBUG] - [15:03:47.799]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [15:03:47.800][IMCORE-本机QoS!]【QoS机制_C2C】89860000191707072527发给xuanweiinfo_server的指纹为a306abde-c2cd-49c4-8728-804716701a36的应答包已成功转发?true | (LogicProcessor^processACK:189)
{"afstatus":"1","data":{"iccid":"89860000191707072527"},"iccid":"","method":"de.regDev","txdate":1509692648967}
[INFO] - [15:03:56.524][IMCORE]与{uid:null}/10.1.1.190:43879的会话建立(sessionCreated)了... | (ServerCoreHandler^sessionCreated:301)
[INFO] - [15:03:56.524][IMCORE]与{uid:null}/10.1.1.190:43879的会话(sessionOpened)打开了... | (ServerCoreHandler^sessionOpened:314)
[INFO] - [15:03:56.525][IMCORE]>> 客户端{uid:null}/10.1.1.190:43879发过来的登陆信息内容是:loginInfo=89860000191707072527|getToken=123456 | (LogicProcessor^processLogin:206)
[DEBUG] - [15:03:56.525]【DEBUG_回调通知】正在调用回调方法:OnVerifyUserCallBack...(extra=null) | (ServerEventListenerImpl^onVerifyUserCallBack:55)
[DEBUG] - [15:03:56.527][IMCORE]【注意】用户id=89860000191707072527已经在在线列表中了,session也是同一个吗?false | (OnlineProcessor^putUser:79)
[DEBUG] - [15:03:56.528]【@】当前在线用户共(2)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [15:03:56.528]【IM_回调通知OnUserLoginAction_CallBack】用户:89860000191707072527 上线了! | (ServerEventListenerImpl^onUserLoginAction_CallBack:73)
[DEBUG] - [15:03:57.420]【IMCORE-本机QoS】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为1... | (QoS4SendDaemonRoot^doTaskOnece:148)
[WARN] - [15:03:57.421]【IMCORE-本机QoS】【QoS发送方】指纹为0686fcfa-3a1c-40dd-8b39-6fd37a99fe8e的包距"刚刚"发出才893ms(<=2000ms将被认定是"刚刚"), 本次不需要重传哦. | (QoS4SendDaemonRoot^doTaskOnece:187)
[INFO] - [15:03:58.122][IMCORE]与{uid:xuanweiinfo_server}/127.0.0.1:61248的会话关闭(user_id=xuanweiinfo_server)了... | (ServerCoreHandler^sessionClosed:265)
[DEBUG] - [15:03:58.122]【DEBUG_回调通知OnUserLogoutAction_CallBack】用户:xuanweiinfo_server 离线了! | (ServerEventListenerImpl^onUserLogoutAction_CallBack:88)
[INFO] - [15:03:58.122][IMCORE]与{uid:89860000191707072527}/10.1.1.190:49650的会话关闭(user_id=89860000191707072527)了... | (ServerCoreHandler^sessionClosed:265)
[DEBUG] - [15:03:58.122]【DEBUG_回调通知OnUserLogoutAction_CallBack】用户:89860000191707072527 离线了! | (ServerEventListenerImpl^onUserLogoutAction_CallBack:88)
[DEBUG] - [15:04:02.421]【IMCORE-本机QoS】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为1... | (QoS4SendDaemonRoot^doTaskOnece:148)
[INFO] - [15:04:02.421][IMCORE]toSession==null >> id=0的用户尝试发给客户端89860000191707072527的消息:str={"code":0}因接收方的id已不在线,此次实时发送没有继续(此消息应考虑作离线处理哦). | (LocalSendHelper^sendData:176)
[WARN] - [15:04:02.421]【IMCORE-本机QoS】【QoS发送方】指纹为0686fcfa-3a1c-40dd-8b39-6fd37a99fe8e的消息包重传失败,它的重传次数之前已累计为1(最多1次). | (QoS4SendDaemonRoot^doTaskOnece:216)
[INFO] - [15:04:07.125][IMCORE]与{uid:89860000191707072527}/10.1.1.190:43879的会话关闭(user_id=89860000191707072527)了... | (ServerCoreHandler^sessionClosed:265)
[WARN] - [15:04:07.125][IMCORE]!用户id=89860000191707072527不存在在线列表中,本次removeUser没有继续. | (OnlineProcessor^removeUser:121)
[DEBUG] - [15:04:07.125]【@】当前在线用户共(0)人-------------------> | (OnlineProcessor^__printOnline:98)
[DEBUG] - [15:04:07.126]【DEBUG_回调通知OnUserLogoutAction_CallBack】用户:89860000191707072527 离线了! | (ServerEventListenerImpl^onUserLogoutAction_CallBack:88)
[DEBUG] - [15:04:07.420]【IMCORE-本机QoS】【QoS发送方】=========== 消息发送质量保证线程运行中, 当前需要处理的列表长度为1... | (QoS4SendDaemonRoot^doTaskOnece:148)
[DEBUG] - [15:04:07.420]【IMCORE-本机QoS】【QoS发送方】指纹为0686fcfa-3a1c-40dd-8b39-6fd37a99fe8e的消息包重传次数已达1(最多1次)上限,将判定为丢包! | (QoS4SendDaemonRoot^doTaskOnece:169)
[WARN] - [15:04:07.420]【IMCORE-本机QoS】【QoS发送方】指纹为0686fcfa-3a1c-40dd-8b39-6fd37a99fe8e的消息已成功从发送质量保证队列中移除(可能是收到接收方的应答也可能是达到了重传的次数上限),重试次数=1 | (QoS4SendDaemonRoot^remove:393)
[DEBUG] - [15:04:07.420]【DEBUG_QoS_S2C事件】收到系统的未实时送达事件通知,当前共有1个包QoS保证机制结束,判定为【无法实时送达】! | (MessageQoSEventS2CListnerImpl^messagesLost:40)
你的进程被杀死了吧,你需要做进程保活,或者当被系统杀死时切为华为自已的推送通道。

看看这篇文章对你有没有帮助:
应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)
引用:JackJiang 发表于 2017-11-03 15:11
你的进程被杀死了吧,你需要做进程保活,或者当被系统杀死时切为华为自已的推送通道。

看看这篇文章对你 ...

不,问题是已经重新登录了,服务器也收到了重新登录的信息,但是后面却变成了离线。并不是一开始都登录不上,这才是关键点
引用:JackJiang 发表于 2017-11-03 15:11
你的进程被杀死了吧,你需要做进程保活,或者当被系统杀死时切为华为自已的推送通道。

看看这篇文章对你 ...

不过你说的也是有可能,我再看看吧,只不过我觉得这个可能性比较低,因为app重启的时候,服务器收到了下线消息,app重新启动后,服务器收到了登录消息,然后过几秒钟服务器就收到了下线消息。
引用:JackJiang 发表于 2017-11-03 15:11
你的进程被杀死了吧,你需要做进程保活,或者当被系统杀死时切为华为自已的推送通道。

看看这篇文章对你 ...

我想问下,服务端会根据消息无法送达来主动踢出session吗?
引用:ving0099 发表于 2017-11-03 18:47
我想问下,服务端会根据消息无法送达来主动踢出session吗?

服务端会判断这个session多久没有数据往来了,跟你Web系统里的Session会话越时时间是类似的机制。
引用:JackJiang 发表于 2017-11-03 15:11
你的进程被杀死了吧,你需要做进程保活,或者当被系统杀死时切为华为自已的推送通道。

看看这篇文章对你 ...

您好,我经过了这样的测试:重启后,开启另外一个线程等待15秒后,发送消息,返回错误信息如下:
【IMCORE】收到服务端的“尚未登陆”的错误消息,心跳线程将停止,请应用层重新登陆.
那证明了我的app进程并没有被杀死。所以我怀疑是服务器的判断逻辑有问题造成的。

暂时我这边的解决办法是,想要拦截该错误信息,该错误信息要在哪里拦截?我拦截到后再重新登录
引用:ving0099 发表于 2017-11-06 17:53
您好,我经过了这样的测试:重启后,开启另外一个线程等待15秒后,发送消息,返回错误信息如下:
【IMCO ...

你的问题好诡异,你可以在服务端的ServerCoreHandler.java这个类里进行调用,服务端所有逻辑都在这个方法里展开的,你好好调试一下,找到真正的原因:
APP自动重启再自动登录的功能,会偶尔出现被服务器判断为未登录的问题_QQ截图20171106180545.png
引用:JackJiang 发表于 2017-11-06 18:07
你的问题好诡异,你可以在服务端的ServerCoreHandler.java这个类里进行调用,服务端所有逻辑都在这个方法 ...

我想知道,在app里面应该在什么地方拦截 “【IMCORE】收到服务端的“尚未登陆”的错误消息,心跳线程将停止,请应用层重新登陆.” 这个错误信息,是使用 ChatTransDataEvent里面的 onErrorResponse 方法吗? 因为我不知道301错误码是不是就是代表没有登录,没找到各个错误码所代表的意思
引用:ving0099 发表于 2017-11-06 18:15
我想知道,在app里面应该在什么地方拦截 “【IMCORE】收到服务端的“尚未登陆”的错误消息,心跳线程将停 ...

我看源代码找到了,错误码代表的意思了
interface ForS
        {
                int RESPONSE_FOR_UNLOGIN = 301;
        }

这个问题解决了没,我现在遇到的也是经常掉线的问题 和你的差不多
签名: Java服务端通过OnlineProcessor up = OnlineProcessor.getInstance();拿到的对象和IM ...
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部