如何检查客户端是否连接到XMPP服务器

时间:2011-05-19 12:52:46

标签: android xmpp smack

我正在为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 个答案:

答案 0 :(得分:5)

如上所述,您需要附加连接侦听器,如下所示:

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");

答案 1 :(得分:2)

您应该可以通过在连接上使用ConnectionListener来完成此操作。这将允许您检测何时断开连接并尝试正确处理它。

列出的代码几乎不会碰到其他条件,因为连接必须一直打开才能接收您正在处理的数据包。

答案 2 :(得分:2)

我自己也遇到过这个问题,现在我已经解决了我的问题而且工作正常。

以下是解决方案: -

  1. 转到您的openfire服务器。登录吧。
  2. 现在打开它后,单击“服务器”选项卡。
  3. 打开SERVER选项卡后,打开子选项卡,即 - SERVER SETTINGS
  4. 打开SERVER SETTINGS后,单击左侧的“SERVER TO SERVER设置”。
  5. 现在这里是第二个选项 - IDLE CONNECTION SETTINGS。
  6. 设置它 - 永远不要关闭空闲连接。
  7. 您的问题将得到解决。

答案 3 :(得分:0)

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

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

从不自动重新连接,如果这是错误,或者您将编写可怕的“决斗资源”错误。再次。像所有其他XMPP客户作者一样。

相关问题