1. 程式人生 > >Android基於XMPP Smack Openfire開發IM【三】客戶端接收伺服器傳送的訊息

Android基於XMPP Smack Openfire開發IM【三】客戶端接收伺服器傳送的訊息

Demo需求:android客戶端接收伺服器傳送來的訊息。

第一,客戶端程式碼如下:
MainActivity未做改動,與之前兩篇一樣
Java程式碼 複製程式碼 收藏程式碼
  1. package com.example.openfiretest;   
  2. import org.jivesoftware.smack.Chat;   
  3. import org.jivesoftware.smack.ChatManager;   
  4. import org.jivesoftware.smack.ChatManagerListener;   
  5. import org.jivesoftware.smack.ConnectionConfiguration;   
  6. import org.jivesoftware.smack.MessageListener;   
  7. import org.jivesoftware.smack.XMPPConnection;   
  8. import org.jivesoftware.smack.packet.Message;   
  9. import android.os.Bundle;   
  10. import android.os.Handler;   
  11. import android.app.Activity;   
  12. import android.content.Intent;   
  13. import android.view.Menu;   
  14. import android.view.View;   
  15. import android.view.View.OnClickListener;   
  16. import android.view.Window;   
  17. import android.widget.CheckBox;   
  18. import android.widget.EditText;   
  19. import android.widget.Toast;   
  20. publicclass MainActivity extends Activity {   
  21. private EditText accountEditText;   
  22. private EditText passwordEditText;   
  23. publicvoid onCreate(Bundle savedInstanceState) {   
  24. super
    .onCreate(savedInstanceState);   
  25.         requestWindowFeature(Window.FEATURE_NO_TITLE);   
  26.         setContentView(R.layout.activity_main);   
  27.         accountEditText = (EditText) findViewById(R.id.username);   
  28.         passwordEditText = (EditText) findViewById(R.id.password);   
  29.         findViewById(R.id.login).setOnClickListener(new OnClickListener() {   
  30. publicvoid onClick(View v) {   
  31.                 String account = accountEditText.getText().toString();   
  32.                 String password = passwordEditText.getText().toString();   
  33. if (account.equals("") || password.equals("")) {   
  34.                     Toast.makeText(MainActivity.this"賬號或密碼不能為空!",   
  35.                             Toast.LENGTH_SHORT).show();   
  36.                 } else {   
  37.                     ClientConServer ccs = new ClientConServer(MainActivity.this);   
  38. boolean b = ccs.login(account, password);   
  39. // 如果登入成功
  40. if (b) {   
  41.                         Toast.makeText(MainActivity.this"登陸成功!",   
  42.                                 Toast.LENGTH_SHORT).show();   
  43.                     } else {   
  44.                         Toast.makeText(MainActivity.this"登陸失敗!",   
  45.                                 Toast.LENGTH_SHORT).show();   
  46.                     }   
  47.                 }   
  48.             }   
  49.         });   
  50.     }   
  51. }  
package com.example.openfiretest;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Message;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	
	
	private EditText accountEditText;
	private EditText passwordEditText;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		accountEditText = (EditText) findViewById(R.id.username);
		passwordEditText = (EditText) findViewById(R.id.password);

		findViewById(R.id.login).setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				String account = accountEditText.getText().toString();
				String password = passwordEditText.getText().toString();
				if (account.equals("") || password.equals("")) {
					Toast.makeText(MainActivity.this, "賬號或密碼不能為空!",
							Toast.LENGTH_SHORT).show();
				} else {
					ClientConServer ccs = new ClientConServer(MainActivity.this);
					boolean b = ccs.login(account, password);
					// 如果登入成功
					if (b) {
						Toast.makeText(MainActivity.this, "登陸成功!",
								Toast.LENGTH_SHORT).show();
						
						
					} else {
						Toast.makeText(MainActivity.this, "登陸失敗!",
								Toast.LENGTH_SHORT).show();
					}
				}
			}
		});
	}
	
}


下面的這個類在第二篇的基礎上,在登陸以後新增一個監聽訊息的監聽器,用來監聽收到的訊息(程式碼89、90行):
Java程式碼 複製程式碼 收藏程式碼
  1. package com.example.openfiretest;   
  2. import java.util.Collection;   
  3. import org.jivesoftware.smack.Chat;   
  4. import org.jivesoftware.smack.ChatManager;   
  5. import org.jivesoftware.smack.ChatManagerListener;   
  6. import org.jivesoftware.smack.ConnectionConfiguration;   
  7. import org.jivesoftware.smack.MessageListener;   
  8. import org.jivesoftware.smack.Roster;   
  9. import org.jivesoftware.smack.RosterEntry;   
  10. import org.jivesoftware.smack.RosterGroup;   
  11. import org.jivesoftware.smack.XMPPConnection;   
  12. import org.jivesoftware.smack.XMPPException;   
  13. import org.jivesoftware.smack.packet.Message;   
  14. import android.content.Context;   
  15. import android.content.Intent;   
  16. import android.os.Handler;   
  17. import android.util.Log;   
  18. import android.widget.Toast;   
  19. publicclass ClientConServer {   
  20. privatestaticint PORT=5222;   
  21. private Context context;   
  22. public ClientConServer(Context context){   
  23. this.context=context;   
  24.     }   
  25. //這裡收到訊息後,通過廣播將訊息傳送到需要的地方.哈哈,既然收到了伺服器傳送來的資訊,如何處理自己決定。
  26. private Handler handler = new Handler(){     
  27. publicvoid handleMessage(android.os.Message m) {     
  28.             Message msg=new Message();     
  29.             msg=(Message) m.obj;    
  30. //把從伺服器獲得的訊息通過廣播發送  
  31.             Intent intent = new Intent("org.yhn.mes");     
  32.             String[] message=new String[]{     
  33.                     msg.getFrom(),     
  34.                     msg.getBody()};    
  35.             System.out.println("==========收到伺服器訊息  From==========="+message[0].toString());   
  36.             System.out.println("==========收到伺服器訊息  Body==========="+message[1].toString());   
  37.             intent.putExtra("message", message);     
  38.             context.sendBroadcast(intent);     
  39.         };     
  40.     };   
  41. publicboolean login(String a,String p){   
  42.         ConnectionConfiguration config = new ConnectionConfiguration("192.168.0.124", PORT);   
  43. /** 是否啟用安全驗證 */
  44.         config.setSASLAuthenticationEnabled(false);   
  45. /** 是否啟用除錯 */
  46. //config.setDebuggerEnabled(true);
  47. /** 建立connection連結 */
  48.         XMPPConnection connection = new XMPPConnection(config);   
  49. try {   
  50. /** 建立連線 */
  51.             connection.connect();   
  52. /** 登入*/
  53.             connection.login(a, p);   
  54. /** 開啟讀寫執行緒,並加入到管理類中*/
  55. //ClientSendThread cst=new ClientSendThread(connection);
  56. //cst.start();
  57. //ManageClientThread.addClientSendThread(a, cst);
  58. //獲取使用者組、成員資訊。
  59.             System.out.println("======開始獲取組及使用者==========");   
  60.             Roster roster = connection.getRoster();   
  61.             Collection<RosterGroup> entriesGroup = roster.getGroups();   
  62.             System.out.println("組的個數:"+entriesGroup.size());   
  63. for(RosterGroup group: entriesGroup){   
  64.                 Collection<RosterEntry> entries = group.getEntries();   
  65.                 System.out.println("=========groupName==="+group.getName());   
  66. for (RosterEntry entry : entries) {   
  67. //Presence presence = roster.getPresence(entry.getUser());
  68. //Log.i("---", "user: "+entry.getUser());
  69.                     System.out.println("組成員名字:"+entry.getName());   
  70. //Log.i("---", "tyep: "+entry.getType());
  71. //Log.i("---", "status: "+entry.getStatus());
  72. //Log.i("---", "groups: "+entry.getGroups());
  73.                 }   
  74.             }   
  75.             System.out.println("======結束獲取組及使用者==========");   
  76. //在登陸以後應該建立一個監聽訊息的監聽器,用來監聽收到的訊息:
  77.             ChatManager chatManager = connection.getChatManager();   
  78.             chatManager.addChatListener(new MyChatManagerListener());   
  79. returntrue;   
  80.         } catch (XMPPException e) {   
  81.             e.printStackTrace();   
  82.         }   
  83. returnfalse;   
  84.      }   
  85. /** message listener*/
  86. class MyChatManagerListener implements ChatManagerListener {     
  87. publicvoid chatCreated(Chat chat, boolean arg1) {     
  88.             chat.addMessageListener(new MessageListener(){     
  89. publicvoid processMessage(Chat arg0, Message msg) {     
  90. /**通過handler轉發訊息*/
  91.                     android.os.Message m=handler.obtainMessage();     
  92.                     m.obj=msg;     
  93.                     m.sendToTarget();    
  94.                 }     
  95.             });     
  96.         }    
  97.     }   
  98. }  
package com.example.openfiretest;

import java.util.Collection;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;


import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;

public class ClientConServer {
	private static int PORT=5222;
	private Context context;
	public ClientConServer(Context context){
		this.context=context;

	}
	//這裡收到訊息後,通過廣播將訊息傳送到需要的地方.哈哈,既然收到了伺服器傳送來的資訊,如何處理自己決定。
	private Handler handler = new Handler(){  
        public void handleMessage(android.os.Message m) {  
            Message msg=new Message();  
            msg=(Message) m.obj; 
            //把從伺服器獲得的訊息通過廣播發送  
            Intent intent = new Intent("org.yhn.mes");  
            String[] message=new String[]{  
                    msg.getFrom(),  
                    msg.getBody()}; 
            System.out.println("==========收到伺服器訊息  From==========="+message[0].toString());
            System.out.println("==========收到伺服器訊息  Body==========="+message[1].toString());
            intent.putExtra("message", message);  
            context.sendBroadcast(intent);  
        };  
    };
	
	public boolean login(String a,String p){
		ConnectionConfiguration config = new ConnectionConfiguration("192.168.0.124", PORT);
		/** 是否啟用安全驗證 */
		config.setSASLAuthenticationEnabled(false);
		/** 是否啟用除錯 */
        //config.setDebuggerEnabled(true);
        /** 建立connection連結 */
		XMPPConnection connection = new XMPPConnection(config);
		try {
			/** 建立連線 */
			connection.connect();
			
			
			/** 登入*/
			connection.login(a, p);
			/** 開啟讀寫執行緒,並加入到管理類中*/
			//ClientSendThread cst=new ClientSendThread(connection);
			//cst.start();
			//ManageClientThread.addClientSendThread(a, cst);
			
			//獲取使用者組、成員資訊。
			System.out.println("======開始獲取組及使用者==========");
			Roster roster = connection.getRoster();
			Collection<RosterGroup> entriesGroup = roster.getGroups();
			System.out.println("組的個數:"+entriesGroup.size());
			for(RosterGroup group: entriesGroup){
				Collection<RosterEntry> entries = group.getEntries();
				System.out.println("=========groupName==="+group.getName());
				for (RosterEntry entry : entries) {
					//Presence presence = roster.getPresence(entry.getUser());
					//Log.i("---", "user: "+entry.getUser());
					System.out.println("組成員名字:"+entry.getName());
					//Log.i("---", "tyep: "+entry.getType());
					//Log.i("---", "status: "+entry.getStatus());
					//Log.i("---", "groups: "+entry.getGroups());
				}
			}
			System.out.println("======結束獲取組及使用者==========");
			
			
			//在登陸以後應該建立一個監聽訊息的監聽器,用來監聽收到的訊息:
			ChatManager chatManager = connection.getChatManager();
			chatManager.addChatListener(new MyChatManagerListener());
			
			
			return true;
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return false;
	 }
	/** message listener*/  
    class MyChatManagerListener implements ChatManagerListener {  
    	
    	
        public void chatCreated(Chat chat, boolean arg1) {  
            chat.addMessageListener(new MessageListener(){  
                public void processMessage(Chat arg0, Message msg) {  
                    /**通過handler轉發訊息*/  
                    android.os.Message m=handler.obtainMessage();  
                    m.obj=msg;  
                    m.sendToTarget(); 
                	
                	
                }  
            });  
        } 
    }
}



第二,啟動android客戶端,進行登入。
[img]

[/img]



第三、在openfire的管理控制檯,會話-工具中傳送訊息給所有線上使用者,如下圖
[img]

[/img]



第四、列印資訊如下:
[img]

[/img]