gpt4 book ai didi

安卓/XMPP : Unable to reconnect to Server after Connection Type Changes

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:38 26 4
gpt4 key购买 nike

我目前正在我大学的一个项目中工作,这是一个 Android 应用程序,应该将数据传送到服务器。

为了做到这一点,我需要通过 XMPP 或多或少地与服务器建立一致的连接。 100% 的连接时间并不重要,但因为系统应该或多或少对用户不可见,所以用户交互应该是最小的。

服务端和客户端都是xmpp-clients。我使用 jabber.org 作为 xmpp 服务器。

我有一个 Android 服务正在建立与服务器的连接并传送数据,并且工作正常。

现在我尝试在连接丢失或从 Wifi 更改为 GSM 时重新连接服务。我想尝试通过监听 NETWORK_STATE_CHANGED_ACTION 的广播接收器来完成这项工作。但我什至没有走到这一步。

这就是问题所在:我尝试运行该应用程序,然后只是禁用了我的 wifi。我的手机然后自动切换到 GSM,我失去了连接(这是我预料到的)。但是当我尝试手动重新连接(例如重新启动服务)时,我从服务器收到错误消息。另外我的状态仍然是“可用”。从那一刻起,我需要很长时间才能再次连接。

06-29 18:12:14.888: WARN/System.err(14246): resource-constraint(500)
06-29 18:12:14.890: WARN/System.err(14246): at org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:110)
06-29 18:12:14.890: WARN/System.err(14246): at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:404)
06-29 18:12:14.890: WARN/System.err(14246): at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:349)
....

我实际上已连接到 xmpp 服务器,但它没有传送我的消息:

06-29 18:12:14.882: INFO/System.out(14246): 06:12:14 nachm. RCV  (1079704816): <iq type='error' id='7rhk4-70'><error code='500' type='wait'><resource-constraint xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq>

有时我没有收到错误,但仍然没有消息被传送。

所以我认为服务器不允许我连接,因为我在尝试重新连接之前没有断开连接。我觉得这很奇怪,因为我认为您甚至可以将多个客户端连接到一个帐户。

我发布了一些我认为可能相关的代码:

public void connectToServer() throws XMPPException {

ConnectionConfiguration config = new ConnectionConfiguration(
serverADD, port,
service);

connection = new XMPPConnection(config);
connection.connect();

SASLAuthentication.supportSASLMechanism("PLAIN", 0);

connection.login(user_JID,password);

Presence presence = new Presence(Presence.Type.available);
presence.setStatus("available");
presence.setPriority(24);
presence.setMode(Presence.Mode.available);
connection.sendPacket(presence);
}

这是我发送消息的方式:

public void sendMessage(String message, String recipient) throws XMPPException {

chat = connection.getChatManager().createChat(recipient, this);
chat.sendMessage(message);

}

有人知道如何解决这个问题吗?只要我的消息被传送到服务器,我什至会使用“肮脏”的技巧。

顺便说一下:发件人和收件人的 jid 总是相同的(在初始设置之后)。以防万一有人认为这很重要。

最佳答案

Smack 断开连接期间的死锁

正如 Airsource Ltd. 在他的评论中提到的:Smack 在 disconnect() 中遇到死锁,记录为 SMACK-278 .我有米 ade a commit that fixes this in my smack fork .

Android 重连处理

对于网络故障转移,请查看 GTalkSMS receiver .它将发出一个 ACTION_NETWORK_CHANGED Intent ,带有 bool 附加值“可用”和“故障转移”。当“available=false”和“fallover=false”时,您的服务应该“停止”连接。如何“停止”连接取决于您。有时,即使修复了 SMACK-278,disconnect() 也会花费很长时间,这就是我们执行 disconnect in an thread that will abort after x seconds 的原因。然后创建一个新的 Connection 实例。当收到带有“available=true”的 Intent 时,我们会重新连接。

您将在 GTalkSMS 源代码中找到其他示例。我让该应用程序永久运行,它实现了稳定但不是 100% 可用的连接(因为 WLAN <-> GSM 开关)。

关于安卓/XMPP : Unable to reconnect to Server after Connection Type Changes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com