国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
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)

[java] view plaincopy
  1. /** 
  2.  * 連接服務(wù)器 
  3.  *  
  4.  * @return 
  5.  */  
  6. public boolean conServer() {  
  7.     ConnectionConfiguration config = new ConnectionConfiguration(  
  8.             127.0.0.1, 5222);  
  9.     /** 是否啟用安全驗(yàn)證 */  
  10.     config.setSASLAuthenticationEnabled(false);  
  11.     /** 是否啟用調(diào)試 */  
  12.     // config.setDebuggerEnabled(true);  
  13.     /** 創(chuàng)建connection鏈接 */  
  14.     try {  
  15.         connection = new XMPPConnection(config);  
  16.         /** 建立連接 */  
  17.         connection.connect();  
  18.         return true;  
  19.     } catch (XMPPException e) {  
  20.         e.printStackTrace();  
  21.     }  
  22.     return false;  
  23. }  

第二、實(shí)現(xiàn)注冊(cè)

關(guān)鍵代碼:

以下代碼注釋都很清楚了,如有不懂的地方可以留言,這里就不多做解釋了。

[java] view plaincopy
  1. /** 
  2.  * 注冊(cè) 
  3.  *  
  4.  * @param account 注冊(cè)賬號(hào) 
  5.  * @param password 注冊(cè)密碼 
  6.  * @return 1、注冊(cè)成功 0、服務(wù)器沒(méi)有返回結(jié)果2、這個(gè)賬號(hào)已經(jīng)存在3、注冊(cè)失敗 
  7.  */  
  8. public String regist(String account, String password) {  
  9.     if (connection == null)  
  10.         return "0";  
  11.     Registration reg = new Registration();  
  12.     reg.setType(IQ.Type.SET);  
  13.     reg.setTo(ClientConServer.connection.getServiceName());  
  14.     reg.setUsername(account);// 注意這里createAccount注冊(cè)時(shí),參數(shù)是username,不是jid,是“@”前面的部分。  
  15.     reg.setPassword(password);  
  16.     reg.addAttribute("android", "geolo_createUser_android");// 這邊addAttribute不能為空,否則出錯(cuò)。所以做個(gè)標(biāo)志是android手機(jī)創(chuàng)建的吧?。。。?!  
  17.     PacketFilter filter = new AndFilter(new PacketIDFilter(  
  18.             reg.getPacketID()), new PacketTypeFilter(IQ.class));  
  19.     PacketCollector collector = ClientConServer.connection  
  20.             .createPacketCollector(filter);  
  21.     ClientConServer.connection.sendPacket(reg);  
  22.     IQ result = (IQ) collector.nextResult(SmackConfiguration  
  23.             .getPacketReplyTimeout());  
  24.     // Stop queuing results  
  25.     collector.cancel();// 停止請(qǐng)求results(是否成功的結(jié)果)  
  26.     if (result == null) {  
  27.         Log.e("RegistActivity", "No response from server.");  
  28.         return "0";  
  29.     } else if (result.getType() == IQ.Type.RESULT) {  
  30.         return "1";  
  31.     } else { // if (result.getType() == IQ.Type.ERROR)  
  32.         if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {  
  33.             Log.e("RegistActivity", "IQ.Type.ERROR: "  
  34.                     + result.getError().toString());  
  35.             return "2";  
  36.         } else {  
  37.             Log.e("RegistActivity", "IQ.Type.ERROR: "  
  38.                     + result.getError().toString());  
  39.             return "3";  
  40.         }  
  41.     }  
  42. }  

第三、實(shí)現(xiàn)登錄

關(guān)鍵代碼: 代碼很簡(jiǎn)單不做太多解釋

[java] view plaincopy
  1.      /** 
  2.  * 登錄 
  3.  *  
  4.  * @param a 登錄賬號(hào) 
  5.  * @param p 登錄密碼 
  6.  * @return 
  7.  */  
  8. public boolean login(String a, String p) {  
  9.     try {  
  10.         if (connection == null)  
  11.             return false;  
  12.         /** 登錄 */             
  13.         connection.login(a, p);  
  14.         return true;  
  15.     } catch (Exception e) {  
  16.         e.printStackTrace();  
  17.     }  
  18.     return false;  
  19. }  

第四、修改密碼

關(guān)鍵代碼:同樣很簡(jiǎn)單

[java] view plaincopy
  1. /**  
  2.  * 修改密碼  
  3.  * @param connection  
  4.  * @return  
  5.  */    
  6. public static boolean changePassword(XMPPConnection connection,String pwd)    
  7. {    
  8.     try {    
  9.         connection.getAccountManager().changePassword(pwd);    
  10.         return true;    
  11.     } catch (Exception e) {    
  12.         return false;    
  13.     }    
  14. }   

第五、更改用戶狀態(tài)

關(guān)鍵代碼:好吧,代碼有點(diǎn)多,不過(guò)很清晰

[java] view plaincopy
  1. /** 
  2.  * 更改用戶狀態(tài) 
  3.  */  
  4. public void setPresence(int code) {  
  5.     if (connection == null)  
  6.         return;  
  7.     Presence presence;  
  8.     switch (code) {  
  9.         case 0:  
  10.             presence = new Presence(Presence.Type.available);  
  11.             connection.sendPacket(presence);  
  12.             Log.v("state", "設(shè)置在線");  
  13.             break;  
  14.         case 1:  
  15.             presence = new Presence(Presence.Type.available);  
  16.             presence.setMode(Presence.Mode.chat);  
  17.             connection.sendPacket(presence);  
  18.             Log.v("state", "設(shè)置Q我吧");  
  19.             System.out.println(presence.toXML());  
  20.             break;  
  21.         case 2:  
  22.             presence = new Presence(Presence.Type.available);  
  23.             presence.setMode(Presence.Mode.dnd);  
  24.             connection.sendPacket(presence);  
  25.             Log.v("state", "設(shè)置忙碌");  
  26.             System.out.println(presence.toXML());  
  27.             break;  
  28.         case 3:  
  29.             presence = new Presence(Presence.Type.available);  
  30.             presence.setMode(Presence.Mode.away);  
  31.             connection.sendPacket(presence);  
  32.             Log.v("state", "設(shè)置離開(kāi)");  
  33.             System.out.println(presence.toXML());  
  34.             break;  
  35.         case 4:  
  36.             Roster roster = connection.getRoster();  
  37.             Collection<RosterEntry> entries = roster.getEntries();  
  38.             for (RosterEntry entry : entries) {  
  39.                 presence = new Presence(Presence.Type.unavailable);  
  40.                 presence.setPacketID(Packet.ID_NOT_AVAILABLE);  
  41.                 presence.setFrom(connection.getUser());  
  42.                 presence.setTo(entry.getUser());  
  43.                 connection.sendPacket(presence);  
  44.                 System.out.println(presence.toXML());  
  45.             }  
  46.             // 向同一用戶的其他客戶端發(fā)送隱身狀態(tài)  
  47.             presence = new Presence(Presence.Type.unavailable);  
  48.             presence.setPacketID(Packet.ID_NOT_AVAILABLE);  
  49.             presence.setFrom(connection.getUser());  
  50.             presence.setTo(StringUtils.parseBareAddress(connection.getUser()));  
  51.             connection.sendPacket(presence);  
  52.             Log.v("state", "設(shè)置隱身");  
  53.             break;  
  54.         case 5:  
  55.             presence = new Presence(Presence.Type.unavailable);  
  56.             connection.sendPacket(presence);  
  57.             Log.v("state", "設(shè)置離線");  
  58.             break;  
  59.         default:  
  60.             break;  
  61.         }  
  62.     }  


第六:注銷(xiāo)

關(guān)鍵代碼:很簡(jiǎn)單吧!

[java] view plaincopy
  1. /**  
  2.  * 刪除當(dāng)前用戶  
  3.  * @param connection  
  4.  * @return  
  5.  */    
  6. public static boolean deleteAccount(XMPPConnection connection)    
  7. {    
  8.     try {    
  9.         connection.getAccountManager().deleteAccount();    
  10.         return true;    
  11.     } catch (Exception e) {    
  12.         return false;    
  13.     }    
  14. }    


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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
android基于xmpp的即時(shí)通訊應(yīng)用
Openfire asmack spark開(kāi)發(fā)桌面與android平臺(tái)的即時(shí)通訊軟件
即時(shí)通訊軟件openfire+spark+smack - 相信自己能行,那就一定能行 - ...
Xmpp協(xié)議 OpenFire服務(wù)器 Asmack Android客戶端 一些Bug的解決方法
企業(yè)即時(shí)通信客戶端的開(kāi)發(fā)
《高性能的RTC服務(wù)器OpenFire》
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服