首页 > 解决方案 > 使用带有 IP 地址的 XMPPTCPConnectionConfiguration 和 setHost() 连接失败

问题描述

我正在尝试使用 Smack API 从 Java 连接 ejabberd 服务器。当我使用以下代码时,我可以连接到 ejabberd 服务器。

String server = "my server ip";
DomainBareJid serviceName = JidCreate.domainBareFrom(server);
        XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                .setHost(server)  method
                .setUsernameAndPassword("uname", "password")
                .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!");*/
        }

执行上述代码后,出现以下错误

org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: '157.230.160.183:5222' failed because: de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for 157.230.160.183.   IN  A yielded an error response NX_DOMAIN, '157.230.160.183:5222' failed because: de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for 157.230.160.183.   IN  AAAA yielded an error response NX_DOMAIN
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:619)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:902)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:383)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at com.example.portalejabberddemo.MainActivity.test(MainActivity.java:94)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at com.example.portalejabberddemo.MainActivity.access$000(MainActivity.java:33)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at com.example.portalejabberddemo.MainActivity$1.doInBackground(MainActivity.java:57)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at com.example.portalejabberddemo.MainActivity$1.doInBackground(MainActivity.java:53)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
08-20 20:42:00.447 27072-27107/com.example.portalejabberddemo W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-20 20:42:00.448 27072-27107/com.example.portalejabberddemo W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
08-20 20:42:00.448 27072-27107/com.example.portalejabberddemo W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
08-20 20:42:00.448 27072-27107/com.example.portalejabberddemo W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
08-20 20:42:00.448 27072-27107/com.example.portalejabberddemo W/System.err:     at java.lang.Thread.run(Thread.java:818)

标签: ipxmppchat

解决方案


Smack 或 MiniDNS (Smack 使用的 DNS 库)将您配置为主机的 IP 处理为文字 DNS 名称。原因是您通过 配置主机 IP setHost(String),但ConnectionConfiguration.Builder.setHost(String)仅用于 DNS 名称。您要么想使用:

请注意,未来的 Smack 版本可能会改变行为setHost()以接受 IP 地址。


推荐阅读