Android/XMPP:连接类型更改后无法重新连接到服务器

Android/XMPP:连接类型更改后无法重新连接到服务器,android,xmpp,smack,Android,Xmpp,Smack,我目前正在我的大学里做一个项目,这是一个安卓应用程序,应该可以将数据传送到服务器 为了做到这一点,我需要通过XMPP或多或少地与服务器保持一致的连接。100%的时间连接在那里并不是很重要,但因为系统对于用户来说或多或少是不可见的,所以用户交互应该是最小的 服务器和客户机都是xmpp客户机。我使用jabber.org作为xmpp服务器 我有一个Android服务,它正在建立与服务器的连接,并提供数据,这很好 现在我尝试在连接丢失或从Wifi更改为GSM时重新连接服务。我想让广播接收器收听网络\状态

我目前正在我的大学里做一个项目,这是一个安卓应用程序,应该可以将数据传送到服务器

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

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

我有一个Android服务,它正在建立与服务器的连接,并提供数据,这很好

现在我尝试在连接丢失或从Wifi更改为GSM时重新连接服务。我想让广播接收器收听
网络\状态\更改\动作
,使这项功能发挥作用。但我甚至没有走到这一步

这就是问题所在:我试着运行应用程序,然后只是禁用我的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 sendMessage(String message, String recipient) throws XMPPException {

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

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

顺便说一下:发送者和接收者JID总是相同的(初始设置后)。以防有人认为这很重要

Smack断开期间出现死锁 正如Airsource有限公司在其评论中提到的:Smack在
disconnect()
中遭遇死锁,该死锁被记录为。我有m

Android重新连接处理 对于网络故障,请查看。它将发出一个动作、一个网络、一个改变了的意图,带有布尔附加值“available”和“fallover”。当“available=false”和“fallover=false”时,您的服务应该“停止”连接。如何“停止”连接取决于您。有时,即使修复了SMACK-278,disconnect()也会花费很长时间,这就是为什么我们要执行此操作,然后创建一个新的连接实例。然后,当接收到带有“available=true”的意图时,我们重新连接


您将在GTalkSMS源代码中找到其他示例。我的应用程序一直在运行,它实现了稳定但不是100%可用的连接(因为WLAN GSM交换机)。

您使用smack还是(a)smack?如果(a)拍打,哪一个?如果您正在重新连接同一资源,而服务器仍然认为存在与同一资源的有效连接,则会发生资源冲突。这取决于服务器策略如何处理。我使用smack,但现在我不知道是哪一个。我使用了asmack,遇到了一些问题,然后互联网上有人提供了一个教程来修补smack版本。我盲目地遵循这一点,因为ist想消除这个错误(甚至不记得是什么)。我可能会通过一些网络搜索找到它是哪一个以及它是什么类型的补丁。我是否可以在每次重新登录时使用自动更改的新资源登录,并在每个步骤中计算优先级,以便邮件仍能送达?感觉有点不对劲。因此我不会在同一台设备上更改资源。事实上,资源的任务是在XMPP中标识相同的端点。您所要做的就是配置XMPP服务器,以便在建立具有相同资源的新连接时终止旧连接。你有解决办法吗?请帮帮我。非常感谢。我从源代码中学到了很多。我不确定我是否已经解决了重新连接的问题,但我现在正在解决。我想我应该让应用程序运行一段时间,看看它能做什么……长时间运行的断开连接似乎是由于断开连接中的BufferedReader.close()和PacketReader中的BufferedReader.read()之间的死锁造成的。这有一个补丁-看到了吗
public void sendMessage(String message, String recipient) throws XMPPException {

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

}