Android smack 4.2.0上的错误:在AAAA中生成了一个错误响应NX_域

Android smack 4.2.0上的错误:在AAAA中生成了一个错误响应NX_域,android,xmpp,chat,smack,Android,Xmpp,Chat,Smack,我启动openFire并使用spark进行测试,一切正常,但当我尝试在android studio中连接smack 4.2.0时,我遇到了以下错误: Ljavax/naming/directory/InitialDirContext 我的依赖性是: 编译“org.igniterealtime.smack:smack-java7:4.2.0”编译 “org.igniterealtime.smack:smack tcp:4.2.0”编译 “org.igniterealtime.smack:smack

我启动openFire并使用spark进行测试,一切正常,但当我尝试在android studio中连接smack 4.2.0时,我遇到了以下错误:

Ljavax/naming/directory/InitialDirContext

我的依赖性是:

编译“org.igniterealtime.smack:smack-java7:4.2.0”编译 “org.igniterealtime.smack:smack tcp:4.2.0”编译 “org.igniterealtime.smack:smack im:4.2.0”编译 “org.igniterealtime.smack:smackextensions:4.2.0”编译 “org.igniterealtime.smack:smackandroid扩展:4.2.0”编译 “org.igniterealtime.smack:smack bosh:4.2.0”

删除此项时: “编译org.igniterealtime.smack:smack-java7:4.2.0” 从依赖项中选择并添加以下内容: 编译“org.igniterealtime.smack:smackandroid:4.2.0” 我的依赖关系变成这样:

编译'com.android.support:appcompat-v7:24.0.0'编译 “org.igniterealtime.smack:smackandroid:4.2.0”编译 “org.igniterealtime.smack:smack tcp:4.2.0”编译 “org.igniterealtime.smack:smack im:4.2.0”编译 “org.igniterealtime.smack:smackextensions:4.2.0”编译 “org.igniterealtime.smack:smackandroid扩展:4.2.0”编译 “org.igniterealtime.smack:smack bosh:4.2.0”

我得到了这个错误:

org.jivesoftware.smack.SmackException$ConnectionException: 以下地址失败:“192.168.209.2:5222”失败,原因是: de.measite.minidns.hla.ResolutionUnsuccessfulException:请求 192.168.209.2. 在生成错误响应的NX_域中,“192.168.209.2:5222”失败,原因是: de.measite.minidns.hla.ResolutionUnsuccessfulException:请求 192.168.209.2. 在AAAA中,生成了一个错误响应NX_域

尝试连接时出错的代码部分如下:


您遇到的错误源于XMPP服务器的地址不完整

想象一下这个场景:

我的ejabberd服务器正在以下地址上运行:192.168.209.2#ejabberd 服务器

有一个名为“localhost”的xmpp域有两个JID

"davood@localhost“和”sadegh@localhost"

在smack中,我想通过我的用户进行身份验证,比如“davood@localhost". 然后,我按照以下步骤进行:

            InetAddress addr = InetAddress.getByName("192.168.209.2");
            HostnameVerifier verifier = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return false;
                }
            };
            DomainBareJid serviceName = JidCreate.domainBareFrom("localhost");
            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                    .setHost(server) # it will be resolved by setHostAddress method
                    .setUsernameAndPassword("davood","mypass")
                    .setPort(5222)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                    .setXmppDomain(serviceName)
                    .setHostnameVerifier(verifier)
                    .setHostAddress(addr)
                    .setDebuggerEnabled(true)
                    .build();
            AbstractXMPPConnection conn1 = new XMPPTCPConnection(config);

            conn1.connect();

            if(conn1.isConnected()){
                Log.d("XMPP","Connected");
            }
            conn1.login();

            if(conn1.isAuthenticated()){
                Log.d("XMPP","Authenticated");
                EntityBareJid jid = JidCreate.entityBareFrom("sadegh@localhost");
                org.jivesoftware.smack.chat2.Chat chat = ChatManager.getInstanceFor(conn1).chatWith(jid);
                chat.send("Eureka, I am connected!");


            }
请检查:

在以前版本的Smack中,ConnectionConfiguration.setHost(字符串)可用于设置XMPP服务的主机IP地址。由于增加了DNSSEC支持,这不再可能。您必须改用新的连接配置ConnectionConfiguration.setHostAddress(InetAddress)

你也可以检查这个


我在Kotlin的Xmpp连接中遇到了一些相同的问题,我根据@Dawood falahati的答案实施了解决方案,但做了一些更改,它对我来说效果很好:

private fun initializeXmppConnection(){
        val addr: InetAddress = InetAddress.getByName("90.182.109.19")
        val verifier: HostnameVerifier = HostnameVerifier { s, sslSession -> false }
        val serviceName: DomainBareJid = JidCreate.domainBareFrom("im.mydomain.ir")
        val config: XMPPTCPConnectionConfiguration = XMPPTCPConnectionConfiguration.builder()
            .setHost("90.182.109.19")
            .setUsernameAndPassword("60b9d4d75943a","9yqx7heu6aok4g40so8s0w8oocow8w8")
            .setPort(80)
            .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
            .setXmppDomain(serviceName)
            .setHostnameVerifier(verifier)
            .setHostAddress(addr)
            .setSendPresence(true)
            .setCompressionEnabled(false)
            .setConnectTimeout(30_000)
            .build()

        val conn: AbstractXMPPConnection = XMPPTCPConnection(config)
        conn.connect();

        if(conn.isConnected())
            Log.d("msn","Connected");

        conn.login();

        if(conn1.isAuthenticated()){
            Log.d("msn","Authenticated");

        }
    }

删除.setXmppDomain(“192.168.1.3”)此方法和setServiceName(),并在登录xmpp服务器时提供用户名和密码这在smack 4.1.6中有效,我目前正在使用它感谢它在上述4.2.0版本中的工作目前我正在使用4.1.9,它正在工作,但我需要新版本4.2.0 Use.setHostAddress(InetAddress.getByName(DOMAIN_IP_ADDRESS))而不是.setHost(HOST),我在将emulator连接到ejabbred服务器时遇到了同样的问题。我按照您的代码片段将主机地址设置为“InetAddress addr=InetAddress.getByName”(“10.0.2.2”)“;但它抛出了这个异常:以下地址失败:“null:5222”。伊朗开发人员总是最好的
private fun initializeXmppConnection(){
        val addr: InetAddress = InetAddress.getByName("90.182.109.19")
        val verifier: HostnameVerifier = HostnameVerifier { s, sslSession -> false }
        val serviceName: DomainBareJid = JidCreate.domainBareFrom("im.mydomain.ir")
        val config: XMPPTCPConnectionConfiguration = XMPPTCPConnectionConfiguration.builder()
            .setHost("90.182.109.19")
            .setUsernameAndPassword("60b9d4d75943a","9yqx7heu6aok4g40so8s0w8oocow8w8")
            .setPort(80)
            .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
            .setXmppDomain(serviceName)
            .setHostnameVerifier(verifier)
            .setHostAddress(addr)
            .setSendPresence(true)
            .setCompressionEnabled(false)
            .setConnectTimeout(30_000)
            .build()

        val conn: AbstractXMPPConnection = XMPPTCPConnection(config)
        conn.connect();

        if(conn.isConnected())
            Log.d("msn","Connected");

        conn.login();

        if(conn1.isAuthenticated()){
            Log.d("msn","Authenticated");

        }
    }