android XMPP實現IM聊天一(登錄和注冊)


     其實對於android基於openfire+asmack+spark的有關於IM聊天的源碼、網上已經可以找出一大堆這些資料了,但是每個人的項目經歷不同,對XMPP的體驗也不同,多少都會有些感悟的,現在我就把我項目中用到XMPP的流程貼出來,也算是自己的一個項目經歷吧。

     對於openfire服務器的搭建與安裝這里我就不介紹了,自己也可以去網上下載一個服務器,安裝方法也很簡單,直接下一步就行,數據庫用自帶的,如果服務器安裝錯誤的話只需要將你openfire的路徑下一個文件改掉,該服務器就會自動從新配置,比如我的openfire路徑:C:\Program Files\Openfire\conf\,找到該配置文件openfire.xml,把  <setup>true</setup>,去掉就行了,當再次重啟openfire服務器的時候,就會重新配置。

    對於asmack,其實是smack針對android興起所制定的一個jar包,更好的配合android開發,這些我也懂的不多,都是從網上了解的....

而spark則是完全是用openfire+asmack實現的一個客戶端軟件,這里只是為了方便測試使用。

    好了話也不多說了,直接切入主題吧,剛剛開始做的時候還是以登陸注冊為主,這是最基本的功能。首先,先連接服務器

1、定義一些變量

1     private int server_port=5222;//端口
2     public XMPPConnection connection=null;//連接
3     private String server_name = "ubuntuserver4java";//服務器名稱
4     private CccallConnectionListener connectionlistener;//斷開連接監聽
5     private String server_host = "192.168.1.140";//服務器ip
6     
7     public static XmppUtil xmpputil=new XmppUtil();

2、打開連接

 1 /   /打開連接
 2     public boolean openConnection(){
 3         try {
 4             if (null == connection || !connection.isAuthenticated()) {
 5                 // 配置連接
 6                 ConnectionConfiguration config = new ConnectionConfiguration(
 7                         server_host, server_port, server_name);
 8                 config.setReconnectionAllowed(true);
 9                 config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
10                 config.setSendPresence(true); // 狀態設為離線,目的為了取離線消息
11                 config.setSASLAuthenticationEnabled(false); // 是否啟用安全驗證
12                 config.setTruststorePath("/system/etc/security/cacerts.bks");
13                 config.setTruststorePassword("changeit");
14                 config.setTruststoreType("bks");
15                 connection = new XMPPConnection(config);
16                 connection.connect();// 連接到服務器
17                 // 配置各種Provider,如果不配置,則會無法解析數據
18                 configureConnection(ProviderManager.getInstance());
19                 return true;
20             }
21         } catch (XMPPException xe) {
22             xe.printStackTrace();
23             connection = null;
24         }
25         return false;
26     }

3、定義的方法

 1 //單例模式
 2     synchronized public static XmppUtil getinstance(){
 3         return xmpputil;
 4     }
 5     
 6     //創建連接
 7     public  XMPPConnection getconnection(){
 8         if(connection==null){
 9             openConnection();
10         }
11         return connection;
12     }

4、關閉連接

 1 //關閉連接
 2     public void closeConnection(){
 3         if(connection!=null){
 4             if(connection.isConnected())
 5                 connection.disconnect();
 6             //移除監聽
 7             connection.removeConnectionListener(connectionlistener);
 8             connection=null;
 9         }    
10     }

5、登陸(直接傳入用戶名和密碼就可以了,注意這里的用戶名和密碼是openfire上面的)

 1 //登錄方法
 2     public boolean login(String name,String pwd){
 3         try {
 4             if(getconnection()==null)
 5                 return false;
 6             
 7             //服務器斷開重連的監聽方法(移除)
 8             if(connectionlistener!=null)
 9                 connection.removeConnectionListener(connectionlistener);
10             getconnection().login(name, pwd);//登錄方法
11             
12             //更改在線狀態
13             Presence pre=new Presence(Presence.Type.available);
14             getconnection().sendPacket(pre);
15             
16             //服務器斷開重連的監聽方法(添加)
17             connectionlistener=new CccallConnectionListener();
18             getconnection().addConnectionListener(connectionlistener);
19             
20             return true;
21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24         return false;
25     }    

6、注冊(添加用戶名和密碼就可以了)

 1 //實現注冊(1、注冊成功 0、服務器沒有返回結果2、這個賬號已經存在3、注冊失敗 )
 2     public String register(String loginName,String pwd){
 3         System.out.println("===================開始注冊到openfire中去了=======================");
 4         if(connection==null)
 5             XmppUtil.getinstance().getconnection();
 6         
 7         Registration re=new Registration();
 8         re.setType(IQ.Type.SET);
 9         re.setTo(connection.getServiceName());
10         
11         re.setPassword(pwd);
12         re.setUsername(loginName);
13         re.addAttribute("android", "geolo_createUser_android");//不能為空
14         
15         System.out.println("注冊到openfire中的姓名是====="+loginName+"密碼是====="+pwd);
16         
17         PacketFilter filter=new AndFilter(new PacketIDFilter(re.getPacketID()),new PacketTypeFilter(IQ.class));
18         PacketCollector collector=connection.createPacketCollector(filter);
19         
20         connection.sendPacket(re);
21         IQ result=(IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
22         
23         collector.cancel();//停止請求result(是否成功的結果)
24         if(result==null)
25             return "0";
26         else if(result.getType()==IQ.Type.RESULT){
27             return "1";
28         }else{
29             if(result.getError().toString().equalsIgnoreCase("conflict(409)")){
30                 return "2";
31             }else{
32                 return "3";
33             }
34         }
35     }    
View Code


方法就這些了,下面講講如何使用上面的方法了

登陸:我的數據都是從Mysql上讀取過來的,所以先在后台判斷了一次登陸,然后再登陸上openfire中

1 boolean loginFlag=XmppUtil.getinstance().login(user.getuId(), upwd);

注冊:根據返回來的res判斷狀態

1  String res=XmppUtil.getinstance().register(uid, repwd);


登陸、注冊就先到這里吧,下一篇....期待吧!!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM