title: XMPP: Smack client not receiving chat message
body: <p>I've been struggling with XMPP chatting a lot through Smack and Openfire server.
  My problem is as follows:</p>
  
  <p>Whenever a user sends a message to another user, the message is received correctly at the other user. But any reply doesn't show up at the sender of the first message.
  So User 1 sends to User 2 successfully. User 2 is then unable to send to User 1 any reply.
  On the other hand, if I restart and let the users login again, User 2 can send to User 1 but not vice versa. </p>
  
  <p>What I'm trying to say is that only the initiator of the chat can send a message, the receiver cannot reply back.</p>
  
  <p>My code looks like <a href="http://www.javacodegeeks.com/2010/09/xmpp-im-with-smack-for-java.html" rel="nofollow">this</a></p>
  
  <pre><code>    package xmpp;
  
  
  public class XMPPClient{
  
  private static final int packetReplyTimeout = 500; // millis
  private XMPPConnection connection;
  private ChatManager chatManager;
  private MessageListener messageListener;
  private ConnectionConfiguration config;
  private MyTimer t = MyTimer.getInstance();
  private ArrayList&lt;String&gt; threadPool = new ArrayList&lt;String&gt;();
  
  public XMPPClient()
  {
      SmackConfiguration.setPacketReplyTimeout(packetReplyTimeout);
  
      //define openfire server information
  
      config = new ConnectionConfiguration("localhost",5222);
      config.setSASLAuthenticationEnabled(false);
      config.setSecurityMode(SecurityMode.disabled);
  
      connection = new XMPPConnection(config);
  
      //connect to server
      t.start("Connecting to server...");
      try {
          connection.connect();
      } catch (XMPPException e) {
          System.err.println("Failed to connect to server! Connect to VPN!\t"+e.getMessage());
          System.exit(0);
      }
      t.end("Connection took ");
  
      //setup chat mechanism
      chatManager = connection.getChatManager();
      chatManager.addChatListener(
              new ChatManagerListener() {
                  @Override
                  public void chatCreated(Chat chat, boolean createdLocally)
                  {
                      if (!createdLocally)
                          chat.addMessageListener(new MyMessageListener());
                  }
      });
  }
  public boolean login(String userName, String password, String resource) {       
      t.start("Logging in...");
      try {
          if (connection!=null &amp;&amp; connection.isConnected()) 
              connection.login(userName, password, resource);
          //set available presence
          setStatus(true);
      } 
      catch (XMPPException e) {
          if(e.getMessage().contains("auth")){
              System.err.println("Invalid Login Information!\t"+e.getMessage());
          }
          else{
              e.printStackTrace();
          }
          return false;
      }
      t.end("Logging in took ");
      return true;
  }
  public void setStatus(boolean available) {
      if(available)
          connection.sendPacket(new Presence(Presence.Type.available));
      else
          connection.sendPacket(new Presence(Presence.Type.unavailable));
  }
  
  public void sendMessage(String message, String buddyJID) throws XMPPException {
      System.out.println(String.format("Sending mesage '%1$s' to user %2$s", message, buddyJID));
      boolean chatExists = false;
      Chat c = null;
      for(String tid : threadPool)
      {
          if((c = chatManager.getThreadChat(tid)) != null)
          {
              if(c.getParticipant().equals(buddyJID))
              {
                  if(checkAvailability(buddyJID))
                  {
                      chatExists = true;
                      break;
                  }
                  else
                  {
                      threadPool.remove(tid);
                      break;
                  }
              }
          }
      }
      if (chatExists)
      {
          Chat chat = c;
          chat.sendMessage(message);
      }
      else
      {
          Chat chat = chatManager.createChat(buddyJID, messageListener);
          threadPool.add(chat.getThreadID()); System.out.println(chat.getThreadID());
          chat.sendMessage(message);
      }
  }
  
  public void createEntry(String user, String name) throws Exception {
      System.out.println(String.format("Creating entry for buddy '%1$s' with name %2$s", user, name));
      Roster roster = connection.getRoster();
      roster.createEntry(user, name, null);
  }
  
  public boolean checkAvailability(String jid)
  {
      System.out.print("Checking availability for: "+jid+"=");
      System.out.println(connection.getRoster().getPresence(jid).isAvailable());
      return connection.getRoster().getPresence(jid).isAvailable();
  }
  
  public void disconnect() {
      if (connection!=null &amp;&amp; connection.isConnected()) {
          setStatus(false);
          connection.disconnect();
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <pre><code>import org.jivesoftware.smack.packet.Message;
  
  public class MyMessageListener implements MessageListener {
  @Override
  public void processMessage(Chat chat, Message message) {
      String from = message.getFrom();
      String body = message.getBody();
      System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
  }
  </code></pre>
  
  <p>}</p>
  
  <p>I'm not sure what the problem is. Any suggestions? Sample code?</p>
  
  <p>Thanks &lt;3 </p>