1
votes

I have implemented a chat application using aSmack. I used the openfire server as the chat server. All of these applications are running in the same machine. But when I try to send messages between two emulators only one emulator successfully receives messages. Other client won't receive any messages. But from both emulators I was able to send messages to pigin(IM clinet). Also if I use gmail.com as the chat server everything works just fine.

User names used to login jayamal suchith (openfire indicates users are online )

names used to send messages jayamal@elearn (elearn is the domain i created in my machine using openfire) suchith@elearn
( but in openfire archives shows one name as jayamal@elearn/Smack, tried sending message to that name but it also unsuccessful )

Please help to rectify this problem. Your help is really appreciated.

public class ASmackChatTestActivity extends Activity {

public int state = 0;
private static final String TAG = "HelloFormStuffActivity"; 

XMPPConnection xmpp ;




/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btnLogin = (Button) findViewById(id.btnLogin);

    btnLogin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            EditText txtUserName = (EditText) findViewById(id.txtUserName);
            EditText txtPass = (EditText) findViewById(id.txtPass);

            String userName = txtUserName.getText().toString();
            String password = txtPass.getText().toString();

            new login().execute(userName,password);
        }
    });



    Button btnSend = (Button) findViewById(id.btnSend);

    btnSend.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            EditText txtMessage = (EditText) findViewById(id.txtMessage);
            EditText txtTo = (EditText) findViewById(id.txtTo);

            String message = txtMessage.getText().toString();
            String to = txtTo.getText().toString();

            new sendMessage().execute(to,message);
        }
    });

    Button btnStop = (Button) findViewById(id.btnStopServices);

    btnStop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            EditText txtTo = (EditText) findViewById(id.txtTo);

            String to = txtTo.getText().toString();

            new recieveMessages().execute(to);
        }
    });


}

class login extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        String userName = params[0];
        String password = params[1];

        //XMPPConnection xmpp = new XMPPConnection("jabber.iitsp.com");

        xmpp = new XMPPConnection("10.0.2.2");

        try {
          xmpp.connect();

          // for other jabber accounts, truncate after the @
          //xmpp.login("username", "password"); 

          // for gtalk / gmail, include the @
          xmpp.login(userName, password);
          Log.v(TAG,"Logged in");

        } catch (XMPPException e) {
          Log.v(TAG, "Failed to connect to " + xmpp.getHost());
          e.printStackTrace();
        }


        return null;
    }

}

class sendMessage extends AsyncTask<String, Void, String>{


    //String msg;

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        String to = params[0];
        String message = params[1];

        ChatManager chatmanager = xmpp.getChatManager();



        Chat newChat = chatmanager.createChat(to, new MessageListener() {
          // THIS CODE NEVER GETS CALLED FOR SOME REASON
           public void processMessage(Chat chat, Message message) {
               try {
                 //  msg = message.getBody();
              Log.v(TAG, "Got:" + message.getBody());
              chat.sendMessage(message.getBody());
            } catch (XMPPException e) {
              Log.v(TAG, "Couldn't respond:" + e);
            }
            Log.v(TAG, message.toString());
          }
        }); 

        // Send something to [email protected]
        try {
          newChat.sendMessage(message);
          Log.v(TAG, "sent:" + message);
        } catch (XMPPException e) {
          Log.v(TAG, "couldn't send:" + e.toString());
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub

        //Toast.makeText(getBaseContext(),"Message Recieved : " + msg, Toast.LENGTH_LONG);
        super.onPostExecute(result);
    }


}

class recieveMessages extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        String to = params[0];

        // Accept only messages from [email protected]
        PacketFilter filter 
            = new AndFilter(new PacketTypeFilter(Message.class), 
                            new FromContainsFilter(to));

        // Collect these messages
        PacketCollector collector = xmpp.createPacketCollector(filter);

        while(true) {
          Packet packet = collector.nextResult();

          if (packet instanceof Message) {
            Message msg = (Message) packet;
            // Process message
            Log.v(TAG, "Got message: " + msg.getBody());
          }
        }

        //return null;
    }


}

}

1

1 Answers

0
votes

Sorry this is a bit late.

The one user you can send to the IM client (pidgin) can you send back to your emulator. I.e. can you receive in either emulator?

Message receiving is event based so you don't need to use a button click to set it off.

Check out this great example. By Davanum Srinivas

I've modified it for my use quite extensively but the base code is still very useful.

http://davanum.wordpress.com/2008/12/29/updated-xmpp-client-for-android/ also look at the original article.