openfire Android學習(一)----實現使用者註冊、登入、修改密碼和登出等
阿新 • • 發佈:2019-01-24
以前學習過用Scoket 建立聊天,簡單的建立聊天是沒問題的,但如果要實現多人複雜的聊天,後臺伺服器程式碼就比較複雜,對於我這新手來講就比較難了。後來在網上看到用openfire做伺服器,利用強大的Smack API庫來實現IM聊天就簡單多了。
網上也有很多關於這方面的資料,我就在這裡把網上的資料和自己的理解總結一下和大家一起交流學習。
需要用到以下幾個工具:
Openfire 最新版本(openfire 3.8.1)
Spark 最新版本(Spark 2.6.3)
ASmack 最新版本 (asmack-jse-buddycloud-2010.12.11.jar)
由於在Android平臺下開發 所以我們用到的是 aSmack,與Smack沒有很大的區別
需要安裝的安裝好,需要下載的下載好(這裡就不多作介紹)。建立專案工程,匯入ASmack jar包,OK,下面就一起去學習怎麼實現 使用者註冊、登入、修改密碼和登出等一些功能!
首先第一、與伺服器建立好連線
關鍵程式碼:127.0.0.1為伺服器IP,5222為伺服器埠號
- /**
- * 連線伺服器
- *
- * @return
- */
- publicboolean conServer() {
- ConnectionConfiguration config = new ConnectionConfiguration(
-
127.0.0.1, 5222
- /** 是否啟用安全驗證 */
- config.setSASLAuthenticationEnabled(false);
- /** 是否啟用除錯 */
- // config.setDebuggerEnabled(true);
- /** 建立connection連結 */
- try {
- connection = new XMPPConnection(config);
- /** 建立連線 */
- connection.connect();
- returntrue;
-
} catch (XMPPException e) {
- e.printStackTrace();
- }
- returnfalse;
- }
第二、實現註冊
關鍵程式碼:
以下程式碼註釋都很清楚了,如有不懂的地方可以留言,這裡就不多做解釋了。
- /**
- * 註冊
- *
- * @param account 註冊帳號
- * @param password 註冊密碼
- * @return 1、註冊成功 0、伺服器沒有返回結果2、這個賬號已經存在3、註冊失敗
- */
- 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註冊時,引數是username,不是jid,是“@”前面的部分。
- reg.setPassword(password);
- reg.addAttribute("android", "geolo_createUser_android");// 這邊addAttribute不能為空,否則出錯。所以做個標誌是android手機建立的吧!!!!!
- 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();// 停止請求results(是否成功的結果)
- if (result == null) {
- Log.e("RegistActivity", "No response from server.");
- return"0";
- } elseif (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";
- }
- }
- }
第三、實現登入
關鍵程式碼: 程式碼很簡單不做太多解釋
- /**
- * 登入
- *
- * @param a 登入帳號
- * @param p 登入密碼
- * @return
- */
- publicboolean login(String a, String p) {
- try {
- if (connection == null)
- returnfalse;
- /** 登入 */
- connection.login(a, p);
- returntrue;
- } catch (Exception e) {
- e.printStackTrace();
- }
- returnfalse;
- }
第四、修改密碼
關鍵程式碼:同樣很簡單
- /**
- * 修改密碼
- * @param connection
- * @return
- */
- publicstaticboolean changePassword(XMPPConnection connection,String pwd)
- {
- try {
- connection.getAccountManager().changePassword(pwd);
- returntrue;
- } catch (Exception e) {
- returnfalse;
- }
- }
第五、更改使用者狀態
關鍵程式碼:好吧,程式碼有點多,不過很清晰
- /**
- * 更改使用者狀態
- */
- publicvoid setPresence(int code) {
- if (connection == null)
- return;
- Presence presence;
- switch (code) {
- case0:
- presence = new Presence(Presence.Type.available);
- connection.sendPacket(presence);
- Log.v("state", "設定線上");
- break;
- case1:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.chat);
- connection.sendPacket(presence);
- Log.v("state", "設定Q我吧");
- System.out.println(presence.toXML());
- break;
- case2:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.dnd);
- connection.sendPacket(presence);
- Log.v("state", "設定忙碌");
- System.out.println(presence.toXML());
- break;
- case3:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.away);
- connection.sendPacket(presence);
- Log.v("state", "設定離開");
- System.out.println(presence.toXML());
- break;
- case4:
- 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());