其實對於android基於openfire+asmack+spark的有關於IM聊天的源碼、網上已經能夠找出一大堆這些資料了,可是每一個人的項目經歷不一樣,對XMPP的體驗也不一樣,多少都會有些感悟的,如今我就把我項目中用到XMPP的流程貼出來,也算是本身的一個項目經歷吧。java
對於openfire服務器的搭建與安裝這裏我就不介紹了,本身也能夠去網上下載一個服務器,安裝方法也很簡單,直接下一步就行,數據庫用自帶的,若是服務器安裝錯誤的話只須要將你openfire的路徑下一個文件改掉,該服務器就會自動重新配置,好比個人openfire路徑:C:\Program Files\Openfire\conf\,找到該配置文件openfire.xml,把 <setup>true</setup>,去掉就好了,當再次重啓openfire服務器的時候,就會從新配置。android
對於asmack,實際上是smack針對android興起所制定的一個jar包,更好的配合android開發,這些我也懂的很少,都是從網上了解的....sql
而spark則是徹底是用openfire+asmack實現的一個客戶端軟件,這裏只是爲了方便測試使用。數據庫
好了話也很少說了,直接切入主題吧,剛剛開始作的時候仍是以登錄註冊爲主,這是最基本的功能。首先,先鏈接服務器ubuntu
一、定義一些變量安全
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();
二、打開鏈接服務器
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 }
三、定義的方法ide
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 }
四、關閉鏈接測試
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 }
五、登錄(直接傳入用戶名和密碼就能夠了,注意這裏的用戶名和密碼是openfire上面的)ui
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 }
六、註冊(添加用戶名和密碼就能夠了)
1 //實現註冊(一、註冊成功 0、服務器沒有返回結果二、這個帳號已經存在三、註冊失敗 ) 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 }
方法就這些了,下面講講如何使用上面的方法了
登錄:個人數據都是從Mysql上讀取過來的,因此先在後臺判斷了一次登錄,而後再登錄上openfire中
1 boolean loginFlag=XmppUtil.getinstance().login(user.getuId(), upwd);
註冊:根據返回來的res判斷狀態
1 String res=XmppUtil.getinstance().register(uid, repwd);
登錄、註冊就先到這裏吧,下一篇....期待吧!!!!