Android IM-based Openfire + Smack Chat Server construction and testing
The XMPP protocol (Extensible Messaging and PresenceProtocol) is an XML-based protocol designed to address timely communication standards, it was first implemented on Jabber. It inherits the flexible development in the XML environment. Therefore, XMPP-based applications are highly scalable. XML is easy to pass through the firewall, so applications built with XMPP are not blocked by the firewall. Using XMPP as a general transmission mechanism, different applications in different organizations can communicate effectively.
First, let's take a look at several concepts.
Openfire is mainly used as a server to manage client communication connections and provide client communication information and connection information.
Smack is mainly implemented by the xmpp protocol and provides a set of good APIs. Therefore, the following operations on xmpp are implemented by using the Smack api. Since 4.1.0, Smack supports Android, therefore, we can use Smack directly. Of course, we use the Asmack package before it is not supported. The method is similar to the smack package.
Spark is the implementation of the IM client, but it is actually implemented using the Smack api.
The second is a set of XMPP-Based APIS, which can be directly referenced. In Android Studio, we can add dependencies directly in gradle.
compile 'org.igniterealtime.smack:smack-android-extensions:4.1.4' compile 'org.igniterealtime.smack:smack-tcp:4.1.4'
Then we need to add network Permissions
Next, regardless of the android client, we will install two software first. First install openfire.
Click the installation package to open and initialize
Select a language. Here, select Chinese.
Click Next after confirming
Agree to the license and click Next
Select the installation directory and click Next. The default directory is displayed.
Continue to the next step
Wait patiently for the file to be decompressed
Click Finish to run Openfire
After running successfully, click Launch Admin to enter the background to complete the remaining installation.
Select language
Server configuration, we change the domain to the local area network IP address
We need to obtain the IP address of our computer.
The obtained IP address is 10.0.0.24. Change the domain to this value.
Select external database, so select the first database.
Then there are some values. select mysql from the drop-down list of the first item, and the values will be filled. Next we need to add a database in mysql.
Assume that you have a local mysql server, open the background, add a user, select create database with the same name as the user name, and grant all Permissions
Change the database name and hostname to the corresponding value. The user name and password are the user and password you just created in mysql.
Select initial settings
Set the openfire Administrator account password. Here, the account is set to admin and the password is set by yourself.
Click to log on to the console
Log on to the background and enter the account and password to log on.
The background is displayed after successful login.
Then install Spark and click the downloaded installation package
Select the installation directory
Click Next
Click Next
Wait until installation is complete
Click finish to run spark
Use admin as our administrator account to log in. The server is local and 127.0.0.1
If the login succeeds, the following interface will appear:
Then we add two test accounts. In the openfire background, enter the information to add users.
Two test accounts are added: test and test1.
Next, the most important thing is the Android terminal. Before that, we need to make our mobile phone and computer out of the same LAN. If you are using a simulator, then, this problem does not exist.
The obtained IP address is 10.0.0.24, and the next step is to write the code to log on.
Get a connection
private XMPPTCPConnection getConnection(){ String server=10.0.0.24; int port=5222; XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder(); builder.setServiceName(server); builder.setHost(server); builder.setPort(port); builder.setCompressionEnabled(false); builder.setDebuggerEnabled(true); builder.setSendPresence(true); builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); XMPPTCPConnection connection = new XMPPTCPConnection(builder.build()); return connection; }
Initialize variable
private EditText account, password,to,content;private Button login,logout,send;private XMPPTCPConnection connection;connection=getConnection();account = (EditText) findViewById(R.id.account);password = (EditText) findViewById(R.id.password);to = (EditText) findViewById(R.id.to);content = (EditText) findViewById(R.id.content);login = (Button) findViewById(R.id.login);logout = (Button) findViewById(R.id.logout);send = (Button) findViewById(R.id.send);login.setOnClickListener(this);logout.setOnClickListener(this);send.setOnClickListener(this);
The implementation of the corresponding click event, that is, the logic for logging in, logging out, and sending messages
@ Override public void onClick (View view) {switch (view. getId () {case R. id. login: {final String a = account. getText (). toString (); final String p = password. getText (). toString (); if (TextUtils. isEmpty (a) | TextUtils. isEmpty (p) {Toast. makeText (getApplicationContext (), the account or password cannot be blank, Toast. LENGTH_LONG ). show (); return;} new Thread (new Runnable () {@ Override public void run () {try {connection. connect (); Connection. login (a, p); Presence presence = new Presence (Presence. type. available); presence. setStatus (I am online); connection. sendStanza (presence); ChatManager chatmanager = ChatManager. getInstanceFor (connection); chatmanager. addChatListener (new ChatManagerListener () {@ Override public void chatCreated (Chat chat, boolean createdLocally) {chat. addMessageListener (new ChatMessageListener () {@ Overri De public void processMessage (Chat chat, Message message) {String content = message. getBody (); if (content! = Null) {Log. e (TAG, from: + message. getFrom () + to: + message. getTo () + message: + message. getBody (); android. OS. message message1 = android. OS. message. obtain (); message1.what = 1; message1.obj = received message: + message. getBody () + from: + message. getFrom (); mHandler. sendMessage (message1) ;}}}) ;}});} catch (SmackException e) {e. printStackTrace ();} catch (IOException e) {e. printStackTrace ();} catch (XMPPException e) {e. printStackTrace ();}}}). start (); break;} case R. id. logout: connection. disconnect (); break; case R. id. send: final String t =. getText (). toString (); final String c = content. getText (). toString (); if (TextUtils. isEmpty (t) | TextUtils. isEmpty (c) {Toast. makeText (getApplicationContext (), receiver or content, Toast. LENGTH_LONG ). show (); return;} try {ChatManager chatmanager = ChatManager. getInstanceFor (connection); Chat mChat = chatmanager. createChat (t + @ 10.0.0.24); mChat. sendMessage (c);} catch (SmackException. notConnectedException e) {e. printStackTrace ();} break ;}}
After receiving the message, you need to operate it in the main thread, just Toast it
private Handler mHandler=new Handler(){ @Override public void handleMessage(android.os.Message msg) { switch (msg.what){ case 1: Toast.makeText(getApplicationContext(),msg.obj+,Toast.LENGTH_SHORT).show(); break; } super.handleMessage(msg); }};
At this time, if you log on with the test account, you will find that you cannot log on and an error will be reported.
The solution is also relatively simple. Go to the Openfire installation directory and find the conf/openfire. xml file.
Add code before closing the last Node
PLAIN
Restart OpenFire. At this time, you will find that you have successfully logged on and can set the user's online status properly.
Log on to Spark with the test account test1, and log on to Android with the test account to test whether the message can be sent successfully.
Source code.