ip - 使用带有 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)
解决方案
Smack 或 MiniDNS (Smack 使用的 DNS 库)将您配置为主机的 IP 处理为文字 DNS 名称。原因是您通过 配置主机 IP setHost(String)
,但ConnectionConfiguration.Builder.setHost(String)
仅用于 DNS 名称。您要么想使用:
ConnectionConfiguration.Builder.setHostAddress(InetAddress)
ConnectionConfiguration.Builder.setHostAddressByNameOrIp(CharSequence)
请注意,未来的 Smack 版本可能会改变行为setHost()
以接受 IP 地址。
推荐阅读
- python - nxn 数据帧到矩阵(.as_matrix 将在未来版本中删除)
- reactjs - React 应用程序性能问题
- git - 没有 .gitmodules 文件的 git 子模块?
- jquery - 在 Select2.js 版本 3.5.4 和 Jquery 1.9 中从列表中删除或添加项目后,未填充多选列表框
- javascript - 循环遍历数组或对象以更新计数
- c# - “无效的日期时间格式。值:2020-01-07 11:46:44”与弹性搜索
- javascript - 如何从 readFile 创建一个常量?
- javascript - 在 node express 应用程序中设置通用路由。(网址/索引,网址/索引2,网址/索引3 ...)
- python - 基于 python 的 Dockerfile 抛出 locale.Error: unsupported locale setting
- firebase - AMP 列表 Firebase INVALID_ARGUMENT __amp_source_origin