1. 程式人生 > >Android基於XMPP Smack Openfire下學習開發IM(一)實現使用者註冊、登入、修改密碼和登出等

Android基於XMPP Smack Openfire下學習開發IM(一)實現使用者註冊、登入、修改密碼和登出等

以前學習過用Scoket 建立聊天,簡單的建立聊天是沒問題的,但如果要實現多人複雜的聊天,後臺伺服器程式碼就比較複雜,對於我這新手來講就比較難了。後來在網上看到用openfire做伺服器,利用強大的Smack API庫來實現IM聊天就簡單多了。 

網上也有很多關於這方面的資料,我就在這裡把網上的資料和自己的理解總結一下和大家一起交流學習。

需要用到以下幾個工具:

Openfire  最新版本(openfire 3.8.1) 

Spark  最新版本(Spark 2.6.3)

ASmack  最新版本 (asmack-jse-buddycloud-2010.12.11.jar)

由於在Android平臺下開發 所以我們用到的是 aSmack,與Smack沒有很大的區別

需要安裝的安裝好,需要下載的下載好(這裡就不多作介紹)。建立專案工程,匯入ASmack jar包,OK,下面就一起去學習怎麼實現 使用者註冊、登入、修改密碼和登出等一些功能!

首先第一、與伺服器建立好連線

關鍵程式碼:127.0.0.1為伺服器IP,5222為伺服器埠號

	/**
	 * 連線伺服器
	 * 
	 * @return
	 */
	public boolean conServer() {
		ConnectionConfiguration config = new ConnectionConfiguration(
				127.0.0.1, 5222);
		/** 是否啟用安全驗證 */
		config.setSASLAuthenticationEnabled(false);
		/** 是否啟用除錯 */
		// config.setDebuggerEnabled(true);
		/** 建立connection連結 */
		try {
			connection = new XMPPConnection(config);
			/** 建立連線 */
			connection.connect();
			return true;
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return false;
	}

第二、實現註冊

關鍵程式碼:

以下程式碼註釋都很清楚了,如有不懂的地方可以留言,這裡就不多做解釋了。

	/**
	 * 註冊
	 * 
	 * @param account 註冊帳號
	 * @param password 註冊密碼
	 * @return 1、註冊成功 0、伺服器沒有返回結果2、這個賬號已經存在3、註冊失敗
	 */
	public String regist(String account, String password) {
		if (connection == null)
			return "0";
		Registration reg = new Registration();
		reg.setType(IQ.Type.SET);
		reg.setTo(ClientConServer.connection.getServiceName());
		reg.setUsername(account);// 注意這裡createAccount註冊時,引數是username,不是jid,是“@”前面的部分。
		reg.setPassword(password);
		reg.addAttribute("android", "geolo_createUser_android");// 這邊addAttribute不能為空,否則出錯。所以做個標誌是android手機建立的吧!!!!!
		PacketFilter filter = new AndFilter(new PacketIDFilter(
				reg.getPacketID()), new PacketTypeFilter(IQ.class));
		PacketCollector collector = ClientConServer.connection
				.createPacketCollector(filter);
		ClientConServer.connection.sendPacket(reg);
		IQ result = (IQ) collector.nextResult(SmackConfiguration
				.getPacketReplyTimeout());
		// Stop queuing results
		collector.cancel();// 停止請求results(是否成功的結果)
		if (result == null) {
			Log.e("RegistActivity", "No response from server.");
			return "0";
		} else if (result.getType() == IQ.Type.RESULT) {
			return "1";
		} else { // if (result.getType() == IQ.Type.ERROR)
			if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
				Log.e("RegistActivity", "IQ.Type.ERROR: "
						+ result.getError().toString());
				return "2";
			} else {
				Log.e("RegistActivity", "IQ.Type.ERROR: "
						+ result.getError().toString());
				return "3";
			}
		}
	}

第三、實現登入

關鍵程式碼: 程式碼很簡單不做太多解釋

 	 /**
	 * 登入
	 * 
	 * @param a 登入帳號
	 * @param p 登入密碼
	 * @return
	 */
	public boolean login(String a, String p) {
		try {
			if (connection == null)
				return false;
			/** 登入 */			
			connection.login(a, p);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

第四、修改密碼

關鍵程式碼:同樣很簡單

    /** 
     * 修改密碼 
     * @param connection 
     * @return 
     */  
    public static boolean changePassword(XMPPConnection connection,String pwd)  
    {  
        try {  
            connection.getAccountManager().changePassword(pwd);  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
    } 

第五、更改使用者狀態

關鍵程式碼:好吧,程式碼有點多,不過很清晰

	/**
	 * 更改使用者狀態
	 */
	public void setPresence(int code) {
		if (connection == null)
			return;
		Presence presence;
		switch (code) {
			case 0:
				presence = new Presence(Presence.Type.available);
				connection.sendPacket(presence);
				Log.v("state", "設定線上");
				break;
			case 1:
				presence = new Presence(Presence.Type.available);
				presence.setMode(Presence.Mode.chat);
				connection.sendPacket(presence);
				Log.v("state", "設定Q我吧");
				System.out.println(presence.toXML());
				break;
			case 2:
				presence = new Presence(Presence.Type.available);
				presence.setMode(Presence.Mode.dnd);
				connection.sendPacket(presence);
				Log.v("state", "設定忙碌");
				System.out.println(presence.toXML());
				break;
			case 3:
				presence = new Presence(Presence.Type.available);
				presence.setMode(Presence.Mode.away);
				connection.sendPacket(presence);
				Log.v("state", "設定離開");
				System.out.println(presence.toXML());
				break;
			case 4:
				Roster roster = connection.getRoster();
				Collection<RosterEntry> entries = roster.getEntries();
				for (RosterEntry entry : entries) {
					presence = new Presence(Presence.Type.unavailable);
					presence.setPacketID(Packet.ID_NOT_AVAILABLE);
					presence.setFrom(connection.getUser());
					presence.setTo(entry.getUser());
					connection.sendPacket(presence);
					System.out.println(presence.toXML());
				}
				// 向同一使用者的其他客戶端傳送隱身狀態
				presence = new Presence(Presence.Type.unavailable);
				presence.setPacketID(Packet.ID_NOT_AVAILABLE);
				presence.setFrom(connection.getUser());
				presence.setTo(StringUtils.parseBareAddress(connection.getUser()));
				connection.sendPacket(presence);
				Log.v("state", "設定隱身");
				break;
			case 5:
				presence = new Presence(Presence.Type.unavailable);
				connection.sendPacket(presence);
				Log.v("state", "設定離線");
				break;
			default:
				break;
			}
		}

第六:登出

關鍵程式碼:很簡單吧!

    /** 
     * 刪除當前使用者 
     * @param connection 
     * @return 
     */  
    public static boolean deleteAccount(XMPPConnection connection)  
    {  
        try {  
            connection.getAccountManager().deleteAccount();  
            return true;  
        } catch (Exception e) {  
            return false;  
        }  
    }  


好吧,這篇就先介紹到這!

相關推薦

Android基於XMPP Smack Openfire學習開發IM()實現使用者註冊登入修改密碼登出

以前學習過用Scoket 建立聊天,簡單的建立聊天是沒問題的,但如果要實現多人複雜的聊天,後臺伺服器程式碼就比較複雜,對於我這新手來講就比較難了。後來在網上看到用openfire做伺服器,利用強大的Smack API庫來實現IM聊天就簡單多了。  網上也有很多關於這方面的資

Android基於XMPP Smack Openfire學習開發IM(五)連接斷開重連

pen ide get ref ces 最好 string smack led 學習過程中大家都碰到過連接被斷開的問題給困擾吧,下面教大家如何做到連接斷開後,重新連接首先要創建連接監聽器,用來監聽連接狀態,這裏我寫了一個類繼承了ConnectionListener,重寫了裏

Android基於XMPP Smack Openfire學習開發IM(五)連線斷開重連

學習過程中大家都碰到過連線被斷開的問題給困擾吧,下面教大家如何做到連線斷開後,重新連線 首先要建立連線監聽器,用來監聽連線狀態,這裡我寫了一個類 繼承了ConnectionListener,重寫了裡面5個方法,最重要的兩個方法connectionClosed()和conn

Android基於XMPP Smack Openfire開發IM【四】初步實現兩個客戶端通訊

本部落格要介紹的內容: Openfire做伺服器端,兩個客戶端:Spark、android模擬器。實現兩個客戶端之間的通訊。 第一步:啟動openfire伺服器。(這裡需要用到兩個使用者登入,前面的部落格中已經說明如何新增使用者了。) [img] [/img] 第

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

Demo需求:android客戶端接收伺服器傳送來的訊息。 第一,客戶端程式碼如下: MainActivity未做改動,與之前兩篇一樣 Java程式碼   package com.example.openfiretest;   import org.jivesoftware.smack.Chat;

android 使用xmpp smack openfire實現即時通訊(

介紹: XMPP :XMPP(可擴充套件訊息處理現場協議)是基於可擴充套件標記語言(XML)的協議,它用於即時訊息(IM)以及線上現場探測。  smack:是一個開源包,易於使用的XMPP(jabber)客戶端類庫 openfire :作為伺服器提供服務。 ope

openfire Android學習)----實現使用者註冊登入修改密碼登出

以前學習過用Scoket 建立聊天,簡單的建立聊天是沒問題的,但如果要實現多人複雜的聊天,後臺伺服器程式碼就比較複雜,對於我這新手來講就比較難了。後來在網上看到用openfire做伺服器,利用強大的Smack API庫來實現IM聊天就簡單多了。  網上也有很多關於這方面

Android IM()實現使用者註冊登入修改密碼登出

以前學習過用Scoket 建立聊天,簡單的建立聊天是沒問題的,但如果要實現多人複雜的聊天,後臺伺服器程式碼就比較複雜,對於我這新手來講就比較難了。後來在網上看到用openfire做伺服器,利用強大的Smack API庫來實現IM聊天就簡單多了。  網上也有很多關於這方面

初識TPOT:一個基於Python的自動化機器學習開發工具

1. TPOT介紹 一般來講,建立一個機器學習模型需要經歷以下幾步: 資料預處理 特徵工程 模型選擇 超引數調整 模型儲存 本文介紹一個基於遺傳演算法的快速模型選擇及調參的方法,TPOT:一種基於Python的自動機器學習開發工具。專案原始碼位於:https://github.com/EpistasisL

Android 基於 MVP 框架的拉重新整理上拉載入頁面,ViewPresenter層基類封裝

前言 Android 專案開發中經常遇到列表式頁面,並且需要實現下拉重新整理,上拉到底後加載下一頁的功能,這裡結合我們專案正在使用的 MVP 框架,介紹一種基類封裝方案,實現 View、Adapter、資料處理Presenter層的基類封裝,後續繼承這幾個類,

Android 百度地圖開發)如何呼叫百度地圖介面在專案中顯示百度地圖以及實現定位

二、下載百度地圖API庫 然後新增到專案中即可。   三、在專案清單AndroidMainifest.xml配置百度地圖API key和新增相關許可權                         四、在專案呼叫百度地圖專案功能,這篇文章就首先講講顯示地圖和定位的功能 首先

Android仿蘋果版QQ拉重新整理實現() ——打造簡單平滑的通用拉重新整理控制元件

前言: 因為公司人員變動原因,導致了博主四個月沒有動安卓,一直在做IOS開發,如今接近年前,終於可以花一定的時間放在安卓上了.好了,廢話不多說,今天我們要帶來的效果是蘋果版本的QQ下拉重新整理.首先看一下目標效果以及demo效果:      因為此效果實現的步驟較多,所

android控制元件之AutoCompleteTextView拉列表顯示片空白

在使用AutoCompleteTextView控制元件時,出現控制元件的下拉列表顯示為空白, 當選中下拉列表的某一欄時卻能看見內容的現象。 原始碼:ArrayAdapter adapter = new ArrayAdapter(AutoComplite.this, and

Effective_STL 學習筆記(二十二) 避免原地修改 set multiset 的健

情況下 刪除元素 一份 pre rpo cast set、map class color 正如所有標準關聯容器,set 和 multiset 保持它們的元素有序,容器的正確行為依賴於它們保持有序,如果改變一個元素的值,新值不在正確的位置,將破壞容器的有序性。 對於

Servlet學習筆記()之Servlet原理初始化生命週期結構體系

Servlet是用java語言編寫的應用到Web伺服器端的擴充套件技術,與java物件的區別是,Servlet物件主要封裝了對HTTP請求的處理,並且它的執行需要Servlet容器的支援(以下會介紹原因,也可以看之前的一篇介紹Servlet容器的部落格,(http://blog.csdn.net/megust

centos7mysql5.7修改密碼外部能訪問的步驟講解所遇到的那些坑(最全)

登入mysql報錯 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 1、登入安裝資料庫的機器 輸入vi /etc/my.cnf,在該配置檔案增加一

《機器學習學習筆記():線性迴歸邏輯迴歸

    本筆記主要記錄學習《機器學習》的總結體會。如有理解不到位的地方,歡迎大家指出,我會努力改正。     在學習《機器學習》時,我主要是通過Andrew Ng教授在mooc上提供的《Machine Learning》課程,不得不說Andrew Ng老師在講授這門課程時,

蝸龍徒行-Spark學習筆記【】初識Spark形成演進發展

【一】Hadoop版本演進過程            由於Hadoop1.X 以前版本在 MapReduce 基本構架的設計上存在作業主控節點(JobTracker)單點瓶頸、作業執行延遲過長、程式設計框架不靈活等較多的缺陷和不足,2011 年 10 月,Hadoop 推出

Django學習筆記4 使用者註冊身份驗證登入登出註冊

1. 使用者註冊和身份驗證 1.建立另一個應用程式users 在專案中新建users python manage.py startapp users 新增應用到settings.py中的INSTALLED_APPS列表中 INSTALLED_APP

android基礎-Toast提示框日曆檢視(CalendarView)元件日期時間選擇器DatePickerTimerPicker

1. Toast提示框 // 建立一個Toast提示資訊 Toast toast = Toast.makeText(MainActivity.this , "簡單