Android基于XMPP Smack Openfire下學(xué)習(xí)開(kāi)發(fā)IM(一)實(shí)現(xiàn)用戶注冊(cè)、登錄、修改密碼和注銷(xiāo)等
以前學(xué)習(xí)過(guò)用Scoket 建立聊天,簡(jiǎn)單的建立聊天是沒(méi)問(wèn)題的,但如果要實(shí)現(xiàn)多人復(fù)雜的聊天,后臺(tái)服務(wù)器代碼就比較復(fù)雜,對(duì)于我這新手來(lái)講就比較難了。后來(lái)在網(wǎng)上看到用openfire做服務(wù)器,利用強(qiáng)大的Smack API庫(kù)來(lái)實(shí)現(xiàn)IM聊天就簡(jiǎn)單多了。
網(wǎng)上也有很多關(guān)于這方面的資料,我就在這里把網(wǎng)上的資料和自己的理解總結(jié)一下和大家一起交流學(xué)習(xí)。
需要用到以下幾個(gè)工具:
Openfire 最新版本(openfire 3.8.1)
下載地址:http://www.igniterealtime.org/downloads/index.jsp
安裝配置可參考:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html
Spark 最新版本(Spark 2.6.3)
下載地址:http://www.igniterealtime.org/downloads/index.jsp
ASmack 最新版本 (asmack-jse-buddycloud-2010.12.11.jar)
由于在Android平臺(tái)下開(kāi)發(fā) 所以我們用到的是 aSmack,與Smack沒(méi)有很大的區(qū)別
下載地址1:http://download.csdn.net/detail/h7870181/6372585 (現(xiàn)在用的就是這個(gè),修改了一些BUG)
下載地址2:http://code.google.com/p/asmack/downloads/list
需要安裝的安裝好,需要下載的下載好(這里就不多作介紹)。創(chuàng)建項(xiàng)目工程,導(dǎo)入ASmack jar包,OK,下面就一起去學(xué)習(xí)怎么實(shí)現(xiàn) 用戶注冊(cè)、登錄、修改密碼和注銷(xiāo)等一些功能!
首先第一、與服務(wù)器建立好連接
關(guān)鍵代碼:127.0.0.1為服務(wù)器IP,5222為服務(wù)器端口號(hào)
- /**
- * 連接服務(wù)器
- *
- * @return
- */
- public boolean conServer() {
- ConnectionConfiguration config = new ConnectionConfiguration(
- 127.0.0.1, 5222);
- /** 是否啟用安全驗(yàn)證 */
- config.setSASLAuthenticationEnabled(false);
- /** 是否啟用調(diào)試 */
- // config.setDebuggerEnabled(true);
- /** 創(chuàng)建connection鏈接 */
- try {
- connection = new XMPPConnection(config);
- /** 建立連接 */
- connection.connect();
- return true;
- } catch (XMPPException e) {
- e.printStackTrace();
- }
- return false;
- }
第二、實(shí)現(xiàn)注冊(cè)
關(guān)鍵代碼:
以下代碼注釋都很清楚了,如有不懂的地方可以留言,這里就不多做解釋了。
- /**
- * 注冊(cè)
- *
- * @param account 注冊(cè)賬號(hào)
- * @param password 注冊(cè)密碼
- * @return 1、注冊(cè)成功 0、服務(wù)器沒(méi)有返回結(jié)果2、這個(gè)賬號(hào)已經(jīng)存在3、注冊(cè)失敗
- */
- 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注冊(cè)時(shí),參數(shù)是username,不是jid,是“@”前面的部分。
- reg.setPassword(password);
- reg.addAttribute("android", "geolo_createUser_android");// 這邊addAttribute不能為空,否則出錯(cuò)。所以做個(gè)標(biāo)志是android手機(jī)創(chuàng)建的吧?。。。?!
- 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();// 停止請(qǐng)求results(是否成功的結(jié)果)
- 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";
- }
- }
- }
第三、實(shí)現(xiàn)登錄
關(guān)鍵代碼: 代碼很簡(jiǎn)單不做太多解釋
- /**
- * 登錄
- *
- * @param a 登錄賬號(hào)
- * @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;
- }
第四、修改密碼
關(guān)鍵代碼:同樣很簡(jiǎn)單
- /**
- * 修改密碼
- * @param connection
- * @return
- */
- public static boolean changePassword(XMPPConnection connection,String pwd)
- {
- try {
- connection.getAccountManager().changePassword(pwd);
- return true;
- } catch (Exception e) {
- return false;
- }
- }
第五、更改用戶狀態(tài)
關(guān)鍵代碼:好吧,代碼有點(diǎn)多,不過(guò)很清晰
- /**
- * 更改用戶狀態(tài)
- */
- 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", "設(shè)置在線");
- break;
- case 1:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.chat);
- connection.sendPacket(presence);
- Log.v("state", "設(shè)置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", "設(shè)置忙碌");
- 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", "設(shè)置離開(kāi)");
- 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());
- }
- // 向同一用戶的其他客戶端發(fā)送隱身狀態(tài)
- 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", "設(shè)置隱身");
- break;
- case 5:
- presence = new Presence(Presence.Type.unavailable);
- connection.sendPacket(presence);
- Log.v("state", "設(shè)置離線");
- break;
- default:
- break;
- }
- }
第六:注銷(xiāo)
關(guān)鍵代碼:很簡(jiǎn)單吧!
- /**
- * 刪除當(dāng)前用戶
- * @param connection
- * @return
- */
- public static boolean deleteAccount(XMPPConnection connection)
- {
- try {
- connection.getAccountManager().deleteAccount();
- return true;
- } catch (Exception e) {
- return false;
- }
- }
好吧,這篇就先介紹到這!
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。