其實對於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 }
方法就這些了,下面講講如何使用上面的方法了
登陸:我的數據都是從Mysql上讀取過來的,所以先在后台判斷了一次登陸,然后再登陸上openfire中
1 boolean loginFlag=XmppUtil.getinstance().login(user.getuId(), upwd);
注冊:根據返回來的res判斷狀態
1 String res=XmppUtil.getinstance().register(uid, repwd);
登陸、注冊就先到這里吧,下一篇....期待吧!!!!