如何在Android中创建使Xmpp与XMPP服务器保持连接的服务?

Posted

技术标签:

【中文标题】如何在Android中创建使Xmpp与XMPP服务器保持连接的服务?【英文标题】:How To Create Service In Android Which Makes Persist Xmpp Connection With XMPP Server? 【发布时间】:2014-09-28 07:39:58 【问题描述】:

在互联网上进行了大量搜索后,我们得出了一个结论,为了确保与 XMPP 服务器的持久连接,我们必须创建一个服务,

我们创建了一个使用 Smack 库与 XMPP 服务器连接的服务器,它可以在移动和 wi-fi 网络上正常工作。

每次你做一些设计方法总是很重要!!!,Smack 已经在库中隐式实现了这种重新连接机制,它监听连接,如果连接断开,Smack 尝试重新连接 XMPP 服务器一些时间间隔。

我们的用例场景:: INTERNET 连接可能是由于 wifi 或数据网络,如果连接处于空闲状态,则有人关闭屏幕 cpu 进入睡眠状态,现在任何数据都通过此连接发送到服务器,因为服务器不再监听客户端,所以将没有响应,在客户端 XMPP 连接已经处于连接模式连接侦听器没有检测到与服务器的任何断开连接,所以这里的流程已经完成。

在 INTERNET 上搜索后,我们发现解决此问题的可能解决方案是在修复后 ping 服务器(我们使用 1 分钟作为修复时间),在检测到 ping 失败后,我们实现了与 smack 相同的重新连接机制(想法取自smack 重连机制本身)通过使用定时器任务。

问题::我们唯一的问题是电池耗尽,如果用户仍然连接到互联网并且重新连接间隔增加,它将耗尽电池。

1)。上述问题的可能解决方案是什么?

2)。我们应该采取另一种方法吗?

【问题讨论】:

【参考方案1】:

如何在 android 中创建持久 Xmpp 连接的服务 使用 XMPP 服务器?

两件事

    通过侦听 CONNECTIVITY_CHANGED 意图重新建立连接,并确定当前使用的数据连接是否断开(并被另一个连接)。 确保通过 ping 服务器建立连接

备注

    只听 CONNECTIVY_CHANGED 是不够的,您需要将之前活动的连接与现在活动的连接进行比较。如果不一样,请重新建立 XMPP 连接。 Smack 4.1 自带ServerPingWithAlarmManager,它会根据PingManager 每30分钟一次的设置检查是否需要ping。此值是硬编码的,无法更改。

使用 1 分钟作为 Ping 间隔是太多了!正如您所经历的那样,它会很快耗尽您的电池电量。合理的 ping 间隔大于 15 分钟,我建议 30 分钟。 Smack 4.1 还将确保仅在 Ping 间隔内没有收到节时才发送 ping。

尽可能使用 XEP-0198:流管理。

我建议查看各种遵循这些准则的开源应用程序,并在不耗尽用户电池电量的情况下实现稳定、永久的连接1

1:仅遵循这些建议并不能保证电池会耗尽。还有更多因素需要考虑。

【讨论】:

谢谢您,我总是发现您的回答有所帮助,因为我们使用的是 ejabberd 2.1.11 XEP-0198 不包含在其中,是的,正如您建议的那样,我将 ping 间隔增加到 15 分钟电池耗尽问题已经解决了,但是我现在已经在数据网络连接问题上妥协了,因为客户端挂断了连接(因为数据网络慢),而服务器不知道 [我们已将服务器 ping 设置为 1,因此消息丢失了最小间隔,如果服务器在 32 秒后发现没有回复,它会终止连接] 这里我们有 1 分钟的黑暗窗口,其中消息丢失 你能建议我解决这个问题吗?在这里我们要确保聊天消息不会丢失!!!

以上是关于如何在Android中创建使Xmpp与XMPP服务器保持连接的服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建与 android 聊天应用程序通信的节点 xmpp 服务器

如何创建nodejs xmpp服务器和android xmpp客户端

XMPP 与 Android 交互

我们如何从 xmpp 服务器将存档消息访问到 android 应用程序

带有 php 服务器的 Android 中的 Xmpp [关闭]

我们可以像在 android 中一样在 windows 中创建 XMPP 聊天客户端代码吗?