4

我正在为 Android 和 iPhone 使用 XMPP 客户端。我已经能够连接到服务器并获得消息了。

但几分钟后客户端与 XMPP 服务器断开连接。IOS XMPP 框架包含一个委托方法,该方法指示客户端是否连接到服务器。如果连接没有断开,那么我们可以使用委托方法重新连接。我在 Android 客户端(我使用的是 aSmack 库)中使用了以下代码来检查连接是否存在。但这似乎行不通。

public void recieveMessage()
{  

           Log.e("xmppclient","will receive messages");
           PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
           connection.addPacketListener(new PacketListener() {

           public void processPacket(Packet packet) {
               if(connection != null && connection.isConnected()) 
               {
                   Message message = (Message) packet;
                   if (message.getBody() != null)
                        {
                   fromName = StringUtils.parseBareAddress(message.getFrom());
                   String messageBody=message.getBody();
                   Log.e("Message", messageBody );
                   Intent i = new Intent(NEW_MESSAGE);  
                   i.putExtra("username", StringUtils.parseBareAddress(message.getFrom()));
                   i.putExtra("message", message.getBody());
                   sendBroadcast(i);
                        }
                   else
                   {

                       connectToXmpp();
                   }
               }

            }

           }
   ,filter);
   }

connectToXMPP() 是打开新连接的方法。

有没有其他方法可以检查连接并在连接消失后立即重新连接到 XMPP...???

4

4 回答 4

6

如上所述,您需要像这样附加一个连接侦听器:

Connection connection = (Connection)params[0];
connection.connect();

connection.addPacketListener(new PacketListener() {

                                 @Override
                                 public void processPacket(Packet packet) {
                                     System.out.println("Received message");
                                 }
                             }, new PacketFilter() {

                                 @Override
                                 public boolean accept(Packet packet) {
                                     System.out.println("Received message");
                                     return true;
                                 }
                             });

connection.addConnectionListener(new ConnectionListener() {
    @Override
    public void connectionClosed() {
        System.out.println("uhoh");
    }

    @Override
    public void connectionClosedOnError(Exception e) {
        System.out.println("uhoh");
    }

    @Override
    public void reconnectingIn(int i) {
        if(i < 4){
            //TODO notify
        }
    }

    @Override
    public void reconnectionSuccessful() {
        System.out.println("uhoh");
    }

    @Override
    public void reconnectionFailed(Exception e) {
        System.out.println("uhoh");
    }
});

connection.login("test2", "test");
于 2013-09-01T05:48:33.257 回答
2

您应该能够通过在连接上使用ConnectionListener来完成此操作。这将允许您检测连接何时断开并尝试适当地处理它。

列出的代码几乎不应该遇到 else 条件,因为必须首先打开连接才能接收您正在处理的数据包。

于 2011-05-20T17:05:33.113 回答
2

我自己也遇到过这个问题,现在我已经解决了我的问题并且它工作得很好。

这是解决方案:-

  1. 转到您的 openfire 服务器。登录它。
  2. 现在打开它后,单击服务器选项卡。
  3. 打开服务器选项卡后打开子选项卡即 - 服务器设置
  4. SERVER SETTINGS 打开后,点击左侧的 SERVER TO SERVER Settings。
  5. 现在这里是第二个选项 - 空闲连接设置。
  6. 将其设置为 - 永远不要关闭空闲连接。

您的问题将得到解决。

于 2012-11-23T09:23:33.673 回答
0

确保在重新连接时始终检查冲突错误。当另一个客户端使用与当前会话相同的完整 JID (local@domain/resource) 登录时,就会发生这种情况。你会得到这个:

<stream:error>
    <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
</stream:error>

永远不要在出现错误时自动重新连接,否则您将编写可怕的“资源决斗”错误。再次。就像所有其他 XMPP 客户端作者一样。

于 2011-05-20T08:14:28.120 回答