默认
发表评论 4
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] MobileIMSDK因安卓端网络事件广播延迟导致登陆失败
在我的demo中,先启动MainActivity.java在里面判断是否是第一次登陆(登陆到我自己的服务端不是这个IM服务端),不是的话直接转到PagerActivity.java并在onCreate里连接IM服务端,代码见附件一(没有判断登陆状态)  ,是的话转登陆页面输入账号密码再转PagerActivity.java连接IM服务端,现在问题是直接转PagerActivity是正确的,从登陆页面转过去登陆失败(稳定失败)。安卓端的失败的log见附件二  (只显示了IMCORE标签的log),很奇怪,竟然先调用getLocalUDPSocket方法,然后调用resetLocalUDPSocket方法,之后才是检测到网络连接的log,此时会再次closeLocalUDPSocket,当receive监听时socket失效并再次reset,然后无法收到服务端发送的loginresponse消息从而登陆失败。正常的连接安卓端log见附件3。
我的问题是两种方式连接IM服务端入口代码都是一样的(都是IMClientManager的init到ClientCoreSDK的init),不知道为何出现了稳定的两种不同的结果,附件四是失败的登陆时服务端的log,图中在OnUserLoginAction的回调后等待了一会然后出现DEBUG_QOS_S2C事件,猜测是没有收到客户端的登陆响应,附件五是成功登陆时的服务端log

最后,问题比较长比较奇葩我还比较菜,打扰大家了。

//补充一下我的解决结果
看log显示失败登陆情况下,是客户端先sendLoginData建立了一次localUDPSocket,然后在未收到服务端返回信息时网络连接的broadcast触发调用closeLocalUDPSocket,导致原socket失效,与服务端建立通信失败
因此我在检测到网络连接成功的broadcast时调用了一个getLocalUDPSocket(在socket可用时啥都不做,不可用时reset,不关注返回值,之所以这么用仅仅是为了用作者的代码而不用自己多写一个函数),这样问题就得到了解决。

另外,为什么两种方式下broadcast收到的时间不同,而且是稳定不同,我并不知道为什么。。。

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

标签:服务端

1.png (43.65 KB, 下载次数: 1177)

1.png

2.png (68.79 KB, 下载次数: 1137)

2.png

3.png (92.18 KB, 下载次数: 1129)

3.png

4.jpg (1.61 MB, 下载次数: 1291)

4.jpg

5.jpg (1.65 MB, 下载次数: 1262)

5.jpg
上一篇:[已解决] MobileIMSDK QoS4SendDaemon类中的代码疑问求解答下一篇:[已回复] MobileIMSDK 客户端连接服务端发送消息问题

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

推荐方案
评论 4
你写这么多字,也不排个版,看起来真累。不过我看明白你的问题了。

你的问题很典型,很多移动端搞网络编程的人刚开始都会遇到。
你描述的问题的原因,其实在于:你客户端能把数据发给服务端,但服务端不能把数据发回来!

如何诊断是否是服务端不能把数据发给客户端呢?
你可以拿到客户端的ip,在服务端的机器上ping客户端,看看能不能通,根据你描述的问题,我认为它应该是不通的。如果是这样,你就要解决你局域网内手机和服务器的网络通信问题,查查路由器的设置什么的。

引用:JackJiang 发表于 2017-05-22 10:27
你写这么多字,也不排个版,看起来真累。不过我看明白你的问题了。

你的问题很典型,很多移动端搞网络编 ...

我刚刚发现问题了,正常下可以建立通信的,但是这种情况下send了登陆请求之后,才收到网络连接的broadcast,于是关闭socket,导致了服务端无法发送给客户端信息,我把具体情况写在补充里面了。

谢谢回答
引用:hfyyqmz 发表于 2017-05-22 10:37
我刚刚发现问题了,正常下可以建立通信的,但是这种情况下send了登陆请求之后,才收到网络连接的broadcas ...

是的,Android的系统广播事件(比如网络连接事件)的发出是有延迟的,原因是Android系统的事件通知优先级很低,它的发送实时性是没有保证的。

建议MobileIMSDK的初始化尽可能的早做(主要是为了让那个网络事件广播监听代码尽早被注册好),比如放在Application里调用:
[已解决] MobileIMSDK因安卓端网络事件广播延迟导致登陆失败_WX20170522-111848@2x.png

引用:JackJiang 发表于 2017-05-22 11:21
是的,Android的系统广播事件(比如网络连接事件)的发出是有延迟的,原因是Android系统的事件通知优先级 ...

知道了,谢谢,我太小白了。。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部