请选择 进入手机版 | 继续访问电脑版

默认
发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] 请教MobileIMSDK的Android端登录问题
如果第一次登录,serverIP填写错误,第二次登录即时serverIP是正确的,也登录不上,调试发现,send数据的时候的serverIP还是第一次的错误IP,
整个框架只有一个地方填装了serverIp,
private int send(byte[] fullProtocalBytes, int dataLen)
        {
                if(!ClientCoreSDK.getInstance().isInitialed())
                        return ErrorCode.ForC.CLIENT_SDK_NO_INITIALED;
                
                if(!ClientCoreSDK.getInstance().isLocalDeviceNetworkOk())
                {
                        Log.e(TAG, "【IMCORE】本地网络不能工作,send数据没有继续!");
                        return ErrorCode.ForC.LOCAL_NETWORK_NOT_WORKING;
                }
                
                DatagramSocket ds = LocalUDPSocketProvider.getInstance().getLocalUDPSocket();
                // 如果Socket没有连接上服务端
                if(ds != null && !ds.isConnected())
                {
                        try
                        {
                                if(ConfigEntity.serverIP == null)
                                {
                                        Log.w(TAG, "【IMCORE】send数据没有继续,原因是ConfigEntity.server_ip==null!");
                                        return ErrorCode.ForC.TO_SERVER_NET_INFO_NOT_SETUP;
                                }
                                
                                // 即刻连接上服务端(如果不connect,即使在DataProgram中设置了远程id和地址则服务端MINA也收不到,跟普通的服
                                // 务端UDP貌似不太一样,普通UDP时客户端无需先connect可以直接send设置好远程ip和端口的DataPragramPackage)
                                ds.connect(InetAddress.getByName(ConfigEntity.serverIP), ConfigEntity.serverUDPPort);
                                Log.e(TAG, "----ip----"+ConfigEntity.serverIP);
                        }
                        catch (Exception e)
                        {
                                Log.w(TAG, "【IMCORE】send时出错,原因是:"+e.getMessage(), e);
                                return ErrorCode.ForC.BAD_CONNECT_TO_SERVER;
                        }
                }
                
                return UDPUtils.send(ds, fullProtocalBytes, dataLen) ? ErrorCode.COMMON_CODE_OK : ErrorCode.COMMON_DATA_SEND_FAILD;
        }

第一次没有connected,结果程序却显示connected,所以DatagramSocket不会重新的获取一次IP,还是用错误的IP

@JackJiang请问DatagramSocket的这个错误该怎么改???

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

标签:MobileIMSDK
上一篇:[已解决] MobileIMSDK的Android客户端如何重新登录服务器???下一篇:[已解决] 请教如何将MobileIMSDK集成到web项目里,作为服务器使用?
推荐方案
评论 6
你不需要纠结这个问题,因为你的app里不可能连ip都会弄错。

其实Demo里我一开始就知道有这种可能性,但为了保持Demo的简洁易懂性就没理它,其实你自已在再次登陆时,手动调用一个LocalSocketProvider.closeLocalUDPSocket()就行了。我如果在demo里加上这一行代码,代码看起来就很怪了。

要加入的代码,就像我的截图里这样,如果你很介意的话,github里的demo我也会加上这行,你到时下载新代码也是一样的:
a.png
引用:JackJiang 发表于 2017-03-08 11:54
你不需要纠结这个问题,因为你的app里不可能连ip都会弄错。

其实Demo里我一开始就知道有这种可能性,但 ...

谢谢你的解答,我只是感觉很奇怪,为什么会出现这种情况,感觉弄不明白就不爽。有一种情况是到时候我们开发的程序可能有其他人去维护或者技术支持,他们不知道这个到底是怎么一回事,然后就死在了登录上。
签名: 该会员没有填写今日想说内容.
引用:niebiao 发表于 2017-03-08 14:10
谢谢你的解答,我只是感觉很奇怪,为什么会出现这种情况,感觉弄不明白就不爽。有一种情况是到时候我们开 ...

不用纠结了,我在Demo里加了一行代码,你去看看MobileIMSDK v2.1.9吧,很简单。

原因就是:UDP是无连接的协议,那个connected状态并非是真的connected,只是Java的socket封装给上层API来判定是否已主动发出ICMP探测包,实际上这个包还应该有个回包,收到回包了才能真正叫“connected”,但Java的上层api没有处理这个,处理也没有意义,反而让事情复杂化。就是这样的。

简单的理解就是:isConnected()方法就是用来告诉开发者,底层已经准备好跟目标ip进行udp通讯,至于目标ip能不能收到或者目标ip是否存在这个udp服务那就不知道了。
引用:JackJiang 发表于 2017-03-08 14:15
不用纠结了,我在Demo里加了一行代码,你去看看MobileIMSDK v2.1.9吧,很简单。

原因就是:UDP是无连 ...

谢谢你的细心解答
签名: 该会员没有填写今日想说内容.
引用:niebiao 发表于 2017-03-08 14:39
谢谢你的细心解答

你是打算自已写IM吗?
引用:JackJiang 发表于 2017-03-08 14:53
你是打算自已写IM吗?

我这边有个实时传递语音的功能,PC端讲话,android端听讲。
签名: 该会员没有填写今日想说内容.
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部