Git Product home page Git Product logo

xmpp-chat-using-openfire-in-web-and-android's Introduction

XMPP Chat using Openfire In Web And Android

For real time messaging or Push Notification we need a server that manage all of that. The Openfire is the solution for it.

To install openfire we need linux server. Here are the links to install openfire.

i) https://linode.com/docs/applications/messaging/install-openfire-on-ubuntu-12-04-for-instant-messaging/

ii) https://www.digitalocean.com/community/tutorials/how-to-install-openfire-xmpp-server-on-a-debian-or-ubuntu-vps

You can also install install it on AWS. You need to open port from AWS dashboard. Just add it in the rules.


After installing openfire server lets start to implement Android Client

Android Client Implementation

We are going to use Asmack android library to implement XMPP client in android. Lets include asmack gradle files

  compile 'org.igniterealtime.smack:smack-android:4.1.1'
  compile 'org.igniterealtime.smack:smack-tcp:4.1.1'
  compile 'org.igniterealtime.smack:smack-core:4.1.1'
  compile 'org.igniterealtime.smack:smack-im:4.1.1'
  compile 'org.igniterealtime.smack:smack-extensions:4.1.1'
  compile 'org.igniterealtime.smack:smack-android-extensions:4.1.1'



Also include Google gson library.

    compile 'com.google.code.gson:gson:1.7.2'

Lets Define Server details in Config.java

public class Config {
  public static final String HOST="Your Server IP address  on which your Openfire Server is installed";
  public static final int PORT=5222; // This is default PORT address of Openfire Server.
}



Now Intialize our android client connection with openfire server. Asmack android client provides XMPPTCPConnection class to implement this.

      XMPPTCPConnection connection;
      XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
      config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
      config.setServiceName(Config.HOST);
      config.setHost(Config.HOST);
      config.setPort(Config.PORT);
      config.setDebuggerEnabled(true);
      XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
      XMPPTCPConnection.setUseStreamManagementDefault(true);
      connection = new XMPPTCPConnection(config.build());
      XMPPConnectionListener connectionListener = new XMPPConnectionListener();
      connection.addConnectionListener(connectionListener);
      PingManager pingManager = PingManager.getInstanceFor(connection);
      pingManager.registerPingFailedListener(this);

Now implement XMPPConnectionListener class. It executes after connection is made with XMPP Server. It is used to check that connection is made successfully with server or not.
 public class XMPPConnectionListener implements ConnectionListener {
       @Override
       public void connected(final XMPPConnection connection) {

           Log.d("xmpp", "Connected!");
       
       }

       @Override
       public void connectionClosed() {
           
           Log.d("xmpp", "ConnectionCLosed!");

       }
       

       @Override
       public void connectionClosedOnError(Exception arg0) {
          
           Log.d("xmpp", "ConnectionClosedOn Error!");
         
       }

       @Override
       public void reconnectingIn(int arg0) {

           Log.d("xmpp", "Reconnectingin " + arg0);

       }

       @Override
       public void reconnectionFailed(Exception arg0) {
           
           Log.d("xmpp", "ReconnectionFailed!");
           
       }

       @Override
       public void reconnectionSuccessful() {
          
           Log.d("xmpp", "ReconnectionSuccessful");
           
       }

       @Override
       public void authenticated(XMPPConnection arg0, boolean arg1) {
           Log.d("xmpp", "Authenticated!");
          

           ChatManager.getInstanceFor(connection).addChatListener(mChatManagerListener);

           new Thread(new Runnable() {

               @Override
               public void run() {
                   try {
                       Thread.sleep(500);
                   } catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }

               }
           }).start();
           
               
               Log.e("xmpp","Conected");
       }
   }


After initializing connection . Now its time to connect with our XMPP Server(Openfire). Don't try to run connecting with XMPP server in UI thread. It should be implemented only in AsyncTask.

      AsyncTask<Void, Void, Boolean> connectionThread = new AsyncTask<Void, Void, Boolean>() {
          @Override
          protected synchronized Boolean doInBackground(Void... arg0) {
              if (connection.isConnected())
                  return false;
                
              Log.d("Connect() Function", "Connecting....");

              try {
                  connection.connect();
                  DeliveryReceiptManager dm = DeliveryReceiptManager
                          .getInstanceFor(connection);
                  dm.setAutoReceiptMode(AutoReceiptMode.always);
                  dm.addReceiptReceivedListener(new ReceiptReceivedListener() {

                      @Override
                      public void onReceiptReceived(final String fromid,
                                                    final String toid, final String msgid,
                                                    final Stanza packet) {

                      }
                  }); 
                  
                  

              } catch (IOException e) {
                   

                  Log.e("Connection Error", "IOException: " + e.getMessage());
              } catch (SmackException e) {
                   
                  Log.e("SMACKException", "SMACKException: " + e.getMessage());
              } catch (XMPPException e) {
                    
                  Log.e("XMPPException",  "XMPPException: " + e.getMessage());

              }
              return true;
          }
      };
      connectionThread.execute();



After connecting with server. Lets register our user from android app. If user is already register its just overwrite current details with new one.

      AccountManager account = AccountManager.getInstance(connection);
      Map<String, String> details = new HashMap<String, String>();
      details.put("name", "Your Name");

      try {
       if (accountManager.supportsAccountCreation()) {
           accountManager.sensitiveOperationOverInsecureConnection(true);
           account.createAccount("Your Username", "Your Password",details);
          }
      } catch (SmackException.NoResponseException e) {
          e.printStackTrace();
      } catch (XMPPException.XMPPErrorException e) {
          e.printStackTrace();
      } catch (NotConnectedException e) {
          e.printStackTrace();
      }



Now lets try to login our newly created user with XMPP server

 try {
          connection.login("Your Username", "Your Password");
          Log.i("LOGIN", "Yey! We're connected to the Xmpp server!");
         
      } catch (XMPPException | SmackException | IOException e) {
          e.printStackTrace();
      } catch (Exception e) {
      }



Lets focus on our main part i.e Chat. Lets create MessageListener which is called when other user send message to me. It implements the ChatMessageListener class.

 class MessageListener implements ChatMessageListener {

       

      @Override
      public void processMessage(final org.jivesoftware.smack.chat.Chat chat,
                                 final Message message) {
          Log.i("MyXMPP_MESSAGE_LISTENER", "Xmpp message received: '"  + message);

          if (message.getType() == Message.Type.chat    && message.getBody() != null) {
             
             Log.e("Message from "+message.getFrom(),message.getBody());
          }
      }
    
  }



Now implement to send message to other user

 Chat mychat;
 String to_username=""; // This is the username of your friend
 MessageListener messageListener = new MessageListener(context);
 mychat = ChatManager.getInstanceFor(connection).createChat( to_username +"@"+Config.HOST,messageListener);
 
       Message message = new Message();
       message.setBody("Your Message");
       message.setType(Message.Type.chat);

      try {
          if (connection.isAuthenticated()) {

              mychat.sendMessage(message);

          } else {

              // login first
          }
      } catch (NotConnectedException e) {
          Log.e("xmpp.SendMessage()", "msg Not sent!-Not Connected!");

      } catch (Exception e) {
          Log.e("xmpp.SendMessage","msg Not sent!" + e.getMessage());
      }

XMPP provides better way to implementing the real time messaging for various application like chat, push notification. If you have your own server then its free for you. No need to pay for third pary libraries. You can even customize XMPP server (Openfire) for your own requirements.

xmpp-chat-using-openfire-in-web-and-android's People

Contributors

webnandroid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.