How to Install Openfire XMPP Server and Use it with Smack Android App From Emulator.

10 minute read

Openfire is an widely used XMPP Server that is written in the Java programming language. It boasts an intuitive and easy to use dashboard where your setup is just interacting with the UI and you can get complex setups done very easily. In this tutorial we are focusing on installing Openfire for use with a Smack based Android App on the local machine were Android Studio is installed. It is in response to my students from the course Build an Android Chat App from Scratch using XMPP and Smack, who happen to need this in big numbers. Let’s get started. Installing Openfire

Openfire and Smack are both developed by an organization called Ignite Realtime, so let’s go to their web page and grab our latest copy of Openfire. Find the Openfire listing and click download for your platform of choice. Being written in Java, Openfire can run on all major desktop platforms : Windows, Mac , Linux. This tutorial is going to be based on Windows, but the same steps should apply to Linux and Mac as well. Start the installer you downloaded and you’ll see a window to let you choose your language

chooseLanguage

I choose English and move on . Confirm that you want to install the package in the following window :

confirmInstall

In the next screens, accept the agreement and chose where you want your packages installed.

acceptAgreementChoosLocation

Hit next and choose whether you want the shortcuts and the install progress dialog will show up

installProgress

And when the install is done, you’ll see a confirmation dialog, prompting you to start the Openfire service to start using it right away.

installSuccess

Hit finish and your default browser will open the openfire welcome page where you choose the language of your install.

openfireWebChooseLanguage

Choose your preferred language and hit continue. You’ll be given a UI where you should set up your domain name.

openfireDomainName

Because we want to use our server locally, we set our domain name to be localhost. If we had set it up to be something else, we would have to go mess with the host files to resolve whatever we put in here to a recognizable network address. Just leave in localhost, it is good enough for our local use purposes. Leave the rest to defaults and hit continue. You are then given a choice for the database you want to use.

chooseDatabase

We choose Embedded database here for convenience, but you can choose Standard Database Connection and set up an external database if you need that. Hit continue and choose a setting for where you want your user info to be saved.

profileSettings

We choose Default in this case. Hit continue, and you are presented a UI where you need to provide server admin info, the email isn’t really important here but you should REMEMBER the password that you put in here .

adminSettings

If you forget the password, you won’t be able to login and see the dashboard for managing your server. Put in your details and hit continue and you’ll see a screen saying that your installation is complete.

installationComplete

Some people haven’t been able to login into the dashboard after a successful install like we have here. An easy fix for that is to stop the openfire service and start it again. Follow the appropriate steps to stop and start openfire on your favorite operating sytem. In this case we are on windows, we are simply going to go in the start menu, find openfire and start a program that allows us to manage it.

manageOpenfire

Click on the yellow icon that says “Openfire Server” and you are going to see a dialog as shown below

openfireManager

You can see that the openfire service is running. We started it right after our install. Stop it and start it again. and then hit Launch Admin to see the web interface where you can login.

openfireLogin

Type in a username of “admin” and the password you specified during your install. Hit login and you should be in your dashboard.

createUser

There is a lot we can do in this dashboard, you can take some time to look around and familiarize yourself with the dashboard if this is your first time with it. For now, click on the Users/Groups tab and hit the create New user button.

newUser

Put in the credentials for your user.Remember that because out domain name is “localhost”, our JIDs are going to look like “gakwaya@localhost”. Hit the create user button and you’ll see a screen confirming your success.

userCreated

We just created one user, but nothing prevents you from creating as many as you want! Openfire is now installed on our local machine. Now we want to use an XMPP Client installed in our virtual device to access it. That’s what we’re doing next.

Communicating from Virtual Device to Host Computer

There is actually an official way to do network communication from Virtual device to Host Computer from the android docs. In the virtual device you push your traffic to an IP address of 10.0.22 and it is forwarded to the address of localhost in the host computer. From our XMPP client, we basically need to specify a HARD CODED host address of 10.0.2.2. This way we can do normal XMPP things with JIDs like “gakwaya@localhost” .

Security : SSL Certificates

Because our server doesn’t have a public facing domain name, and is running locally, we can’t set up an SSL certificate for it. So we will need to disable security when connecting to our server as shown below

.setDebuggerEnabled(true)
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) // Should make required on Public Server with SSL Configured
.setCompressionEnabled(true).build();

Adapting the Source Code of your XMPP client

When our XMPP client is talking to our local server, we need to do two things. One is address the XMPP traffic to an IP address of 10.0.2.2 and the other is to use a domain name of “localhost”. That’s what we set up our server to use. We do all that when connecting to the server with the code snippet below :

XMPPTCPConnectionConfiguration conf = XMPPTCPConnectionConfiguration.builder()

        //.setXmppDomain(mServiceName)//Public Internet server
        //.setHost(mServiceName) //Public Internet Server

        .setHostAddress(InetAddress.getByName("10.0.2.2"))  //Local Server
        .setXmppDomain(JidCreate.domainBareFrom("localhost"))  //Local Server
        .setResource("Rooster+")

Notice that I left in the code you should use when your client is talking to a public server. When you need that,m just comment out the //Local server flagged lines and uncomment the //Public Internet Server ones. You should also note that we have a hard coded XMPP domain because the user doesn’t have the flexibility of using other servers. Switching from local to public is a thing you can control only in code in this case. A screenshot of my setup is shown below in case it helps clarify things.

androidProject

This should give you a local environment to test your Smack Android XMPP client against. If you have any questions or queries, please do shoot me in the comments below. I hope this has been informative to you and thanks for reading.

XMPP Smack Android Comprehensive Video Course Available! By the very same author of this tutorial.

foo

Follow up course on Sending and Receiving Files with XMPP and Smack also available!

10 Comments

Commenting not available on this page at the moment! Please hit the author on various social media channels or share your thoughts on this github issue. Worthy conversations will be reproduced here. Thanks for understanding

Avatar	
Andrew Anim
August 14, 2018 at 2:57 pm Reply	

Hello I bought your tutorial on udemy and gone through it. I have tried to implement the solution on my local machine using it as the server but it gives the error “Something went wrong while connecting ,make sure the credentials are right and try again”
    gakwaya	
    gakwaya
    August 16, 2018 at 1:22 pm Reply	

    Hi Andrew,
    I don’t have enough info to know what is wrong with your setup but you can try to connect to your server using another xmpp client like Xabber. If you find it cumbersome to install and android client on a virtual device just to test your environment, you can try using a desktop client like gajim (https://gajim.org/). They all equally work well to make sure your clients can talk to your server. Let me know how it turns out.
Avatar	
Andrew Anim
September 3, 2018 at 12:50 am Reply	

Hi, Gakwaya I’m trying to connect to my localhost server but its not connecting, below is the error message

at android.view.ViewRootImpl.(ViewRootImpl.java:511)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:329)
at android.support.v7.app.AlertDialog$Builder.show(AlertDialog.java:958)
at com.blikoon.roosterplus.ChatListActivity.requestBatteryOptimizationsFavor(ChatListActivity.java:145)
at com.blikoon.roosterplus.ChatListActivity.onCreate(ChatListActivity.java:102)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
09-03 05:46:31.148 5558-5558/com.blikoon.roosterplus I/AssistStructure: Flattened final assist data: 3496 bytes, containing 1 windows, 12 views
09-03 05:46:35.856 5558-5558/com.blikoon.roosterplus D/RoosterPlus: saveCredentialsAndLogin() called.
09-03 05:46:36.543 5558-5558/com.blikoon.roosterplus D/RoosterConService: Service Start() function called. mActive :false
09-03 05:46:36.545 5558-5558/com.blikoon.roosterplus I/Choreographer: Skipped 40 frames! The application may be doing too much work on its main thread.
09-03 05:46:36.545 5558-5587/com.blikoon.roosterplus D/RoosterConService: initConnection()
09-03 05:46:36.554 5558-5587/com.blikoon.roosterplus D/RoosterConnection: RoosterConnection Constructor called.
09-03 05:46:36.564 5558-5579/com.blikoon.roosterplus I/OpenGLRenderer: Davey! duration=748ms; Flags=1, IntendedVsync=951031575171, Vsync=951064908503, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=951080838100, AnimationStart=951080907200, PerformTraversalsStart=951081557020, DrawStart=951116214810, SyncQueued=951743045040, SyncStart=951745136460, IssueDrawCommandsStart=951745335060, SwapBuffers=951770358490, FrameCompleted=951782197170, DequeueBufferDuration=598000, QueueBufferDuration=1267000,
09-03 05:46:36.598 5558-5579/com.blikoon.roosterplus I/OpenGLRenderer: Davey! duration=716ms; Flags=0, IntendedVsync=951085986707, Vsync=951752653347, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=951763412130, AnimationStart=951763475950, PerformTraversalsStart=951767307260, DrawStart=951768032220, SyncQueued=951768305590, SyncStart=951782373500, IssueDrawCommandsStart=951782691050, SwapBuffers=951801511200, FrameCompleted=951816324830, DequeueBufferDuration=52000, QueueBufferDuration=240000,
09-03 05:46:37.191 5558-5587/com.blikoon.roosterplus D/RoosterConnection: Calling connect()
09-03 05:47:07.193 5558-5588/com.blikoon.roosterplus W/PingManager: XMPPConnection was not authenticated
09-03 05:47:07.203 5558-5587/com.blikoon.roosterplus D/RoosterConService: Something went wrong while connecting ,make sure the credentials are right and try again
09-03 05:47:07.205 5558-5558/com.blikoon.roosterplus D/RoosterPlus: Got Connection Error in login activity
09-03 05:47:07.206 5558-5587/com.blikoon.roosterplus D/RoosterConService: Sent the broadcast for connection Error from service
09-03 05:47:07.207 5558-5587/com.blikoon.roosterplus D/RoosterConService: Logged in state :falsecalling stopself()
09-03 05:47:07.216 5558-5587/com.blikoon.roosterplus W/System.err: org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: ‘10.0.2.2:5222’ failed because: /10.0.2.2 exception: java.net.SocketTimeoutException: failed to connect to /10.0.2.2 (port 5222) from /192.168.232.2 (port 54330) after 30000ms
at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:619)
at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:902)
at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:380)
at com.blikoon.roosterplus.xmpp.RoosterConnection.connect(RoosterConnection.java:243)
at com.blikoon.roosterplus.xmpp.RoosterConnectionService.initConnection(RoosterConnectionService.java:51)
at com.blikoon.roosterplus.xmpp.RoosterConnectionService.access$100(RoosterConnectionService.java:24)
at com.blikoon.roosterplus.xmpp.RoosterConnectionService$1.run(RoosterConnectionService.java:120)
at java.lang.Thread.run(Thread.java:764)
09-03 05:47:07.306 5558-5558/com.blikoon.roosterplus D/RoosterConService: stop()
09-03 05:47:07.307 5558-5587/com.blikoon.roosterplus D/RoosterConnection: Disconnecting from server localhost
09-03 05:47:07.310 5558-5579/com.blikoon.roosterplus D/EGL_emulation: eglMakeCurrent: 0xe0385300: ver 2 0 (tinfo 0xe0383650)
09-03 05:47:07.337 5558-5579/com.blikoon.roosterplus D/EGL_emulation: eglMakeCurrent: 0xe0385300: ver 2 0 (tinfo 0xe0383650)
    gakwaya	
    gakwaya
    September 3, 2018 at 10:40 am Reply	

    I would try and connect with a desktop client like gajim( https://gajim.org/) as stated in a previous response and make sure whether the problem is on the server, or the client. Please download gajim ( or any other xmpp desktop client form your host platform) and try to connect with a JID with format ( username@localhost ) , for a user you defined in your Openfire server and use the password you defined there.If that works well , you’ll know the problems is in the android xmpp client, if it doesn’t then it’s the server that is problematic.
    Hope this helps.
Avatar	
Eric
September 10, 2018 at 6:06 pm Reply	

thank you very much sir for this wonderful tutorial. i have downloaded and configured my xmpp server with openfire, i have also tested it with gajim and it connected but I’m still unable to send messages from my android app, i am using your code from your first tutorial to connect to my xmpp server but whenever i click on send message button it returns the “Client not connected to server ,Message not sent!” message. please sir i really need your help because i have been stock here for weeks now and i don’t know were else to look.i would really appreciate your help. thanks in advance
Avatar	
Jonathan R
April 5, 2019 at 12:06 am Reply	

Hola amigo buenas tardes disculpe, compre tu curso de XMPP para el envio de archivos por medio del chatt y entre otras cosas. Quisiera hacer mi conexion a openfire segui tus intrucciones pero no hay respuesta alguna no se si me podrias ayudar por favor
Avatar	
Jonathan
April 5, 2019 at 3:33 am Reply	

Hi, sorry I need your help to be able to make the Xmpp connection with Openfire. I followed the steps you have on your website, but it does not work for me. I do not know if you could help me. The course that you are offering I already have it. But I need to be able to make that connection, I do not know if you have any mail or something to contact me. I would greatly appreciate your help.
    gakwaya	
    gakwaya
    April 7, 2019 at 11:21 am Reply	

    Hi Jonathan,
    Sorry for late reply. What do you mean exactly the by “the connection is not working”? Could you share more details? For example the error message if any ? You can join our facebook page for more direct support ( https://web.facebook.com/Blikoon/ )
        Avatar	
        Jonathan
        April 11, 2019 at 5:30 pm Reply	

        I could already to connected openfire but i have other problem to transference files. i don’t know if you can help me in this problem. The error is: org.jivesoftware.smack.SmackException: No upload service specified and also none discovered.
            Daniel	
            Daniel
            May 3, 2019 at 10:11 am Reply	

            The error suggests that your server is not configured for http file upload. I believe it’s configurable as a plugin in openfire. Hope this helps.