本地主机上 Smack 和 Openfire 之间的路由错误

Posted

技术标签:

【中文标题】本地主机上 Smack 和 Openfire 之间的路由错误【英文标题】:Routing error between Smack and Openfire on localhost 【发布时间】:2016-11-05 10:54:36 【问题描述】:

我有一个实现 Smack 4.1.7 的 Java 应用程序,我将它用作 Openfire 4.0.2 的模拟客户端。目前,Openfire 正在我的本地主机上运行。 Smack 可以通过此连接正确登录和验证:

XMPPTCPConnectionConfiguration conf = XMPPTCPConnectionConfiguration.builder()
      .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
      .setServiceName(XMPP_HOST_NAME) // equals xmppDomain on server
      .setUsernameAndPassword("user1", "pwd1")
      .setResource("tester")
      .setDebuggerEnabled(true)
      .build();

现在,当 Smack 尝试创建或加入 MUC 时,请求超时 (SmackException$NoResponseException) 并且 Openfire 会记录以下内容:

2016.07.03 18:58:54 org.jivesoftware.openfire.spi.RoutingTableImpl - 
Unable to route packet. Packet should only be sent to available sessions and the 
route is not available. 
<presence id="WrkXH-6" from="user1@localhost/tester" to="user1@localhost/tester">
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="NfJ3flI83zSdUDzCEICtbypursw="/>
</presence>
2016.07.03 18:58:54 org.jivesoftware.openfire.spi.RoutingTableImpl - 
Failed to route packet to JID: user1@localhost/tester packet: 
<presence id="WrkXH-6" from="user1@localhost/tester" to="user1@localhost/tester">
    <c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="NfJ3flI83zSdUDzCEICtbypursw="/>
</presence>

我在服务器端和客户端都使用了“localhost”、“127.0.0.1”和我的机器名称为 XMPP_HOST_NAME,但我一直收到同样的错误。任何帮助将不胜感激。

【问题讨论】:

对不起,你用用户登录了吗? localhost 将不起作用,机器名称(但您必须在控制面板中检查 openfire 服务器名称)将起作用。对我来说,来自同一个人的存在似乎很奇怪,但我必须检查 是的,登录工作正常。它都适用于 localhost、127.0.0.1 和机器名称(无论在 openfire 端配置什么)。建立连接时 Smack 端出现警告:org.jivesoftware.smack.util.DNSUtil resolveDomain WARNING: Exception while resovling SRV records for localhost。考虑添加 '_xmpp-(server|client)._tcp' DNS SRV 记录,但该连接和身份验证都可以。 也许你有一个代理,你必须添加本地主机(是的,127.0.0.1)作为例外...... @R_R 嗨。请问您是否需要openfire(或任何其他服务器)才能正常工作?我只想在我的电脑上运行一个简单的例子。如果这对您来说很容易,您可以发布您的所有课程吗?或者你能指导我一些教程吗?谢谢 【参考方案1】:

我发现了问题和错误。 如何处理:

Openfire 有 2 个值:

http.connection.timeout
http.socket.timeout 

如果在属性中不可用,则两者都设置为默认值 2000/3000/5000 毫秒。

因此需要通过管理控制台(或数据库)将此值设置为更高的值,如 15000/20000 或更多(如果需要)。

更多,在 Openfire 4.0.2(也可能是旧版本)中,index.jsp 中有一个检查 rssfeed 的调用(默认启用 strong>) 但是这个调用会将这些值重置为 3000,所以基本上超时将是无用的。

禁用 rssfeed 设置为 false

rss.enabled

然后重新启动 Openfire。

【讨论】:

以上是关于本地主机上 Smack 和 Openfire 之间的路由错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用中使用 Smack 从 Openfire 服务器恢复两个用户之间的聊天记录

运行 localhost openfire 和 smack 客户端库 android

使用 smack api 连接到 openfire 服务器

如何使用 Smack 从 android 客户端获取 openfire 在线注册用户?

XMPP Openfire 连接被拒绝

无法通过 Smack API 使用 openfire 服务器发送/接收消息