以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了。后来在网上看到用openfire做服务器,利用强大的Smack API库来实现IM聊天就简单多了。

网上也有很多关于这方面的资料,我就在这里把网上的资料和自己的理解总结一下和大家一起交流学习。

需要用到以下几个工具:

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平台下开发 所以我们用到的是 aSmack,与Smack没有很大的区别

下载地址1:http://download.csdn.net/detail/h7870181/6372585 (现在用的就是这个,修改了一些BUG)

下载地址2:http://code.google.com/p/asmack/downloads/list

需要安装的安装好,需要下载的下载好(这里就不多作介绍)。创建项目工程,导入ASmack jar包,OK,下面就一起去学习怎么实现 用户注册、登录、修改密码和注销等一些功能!

首先第一、与服务器建立好连接

关键代码:127.0.0.1为服务器IP,5222为服务器端口号

[java] view
plain
copy

  1. /**
  2. * 连接服务器
  3. *
  4. * @return
  5. */
  6. public boolean conServer() {
  7. ConnectionConfiguration config = new ConnectionConfiguration(
  8. 127.0.0.1, 5222);
  9. /** 是否启用安全验证 */
  10. config.setSASLAuthenticationEnabled(false);
  11. /** 是否启用调试 */
  12. // config.setDebuggerEnabled(true);
  13. /** 创建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. }

第二、实现注册

关键代码:

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

[java] view
plain
copy

  1. /**
  2. * 注册
  3. *
  4. * @param account 注册帐号
  5. * @param password 注册密码
  6. * @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败
  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注册时,参数是username,不是jid,是“@”前面的部分。
  15. reg.setPassword(password);
  16. reg.addAttribute("android", "geolo_createUser_android");// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!!
  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();// 停止请求results(是否成功的结果)
  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. }

第三、实现登录

关键代码: 代码很简单不做太多解释

[java] view
plain
copy

  1. /**
  2. * 登录
  3. *
  4. * @param a 登录帐号
  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. }

第四、修改密码

关键代码:同样很简单

[java] view
plain
copy

  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. }

第五、更改用户状态

关键代码:好吧,代码有点多,不过很清晰

[java] view
plain
copy

  1. /**
  2. * 更改用户状态
  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", "设置在线");
  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", "设置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", "设置忙碌");
  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", "设置离开");
  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. // 向同一用户的其他客户端发送隐身状态
  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", "设置隐身");
  53. break;
  54. case 5:
  55. presence = new Presence(Presence.Type.unavailable);
  56. connection.sendPacket(presence);
  57. Log.v("state", "设置离线");
  58. break;
  59. default:
  60. break;
  61. }
  62. }



第六:注销

关键代码:很简单吧!

[java] view
plain
copy

  1. /**
  2. * 删除当前用户
  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. }

好吧,这篇就先介绍到这!

openfire Android学习(一)----实现用户注册、登录、修改密码和注销等的更多相关文章

  1. Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等

    http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...

  2. FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码

    之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...

  3. mysql 登录修改密码与数据库备份

    1.mysql首次登录修改密码 mysql -uroot -p(首次登录无密码,按回车即可:如果无法登陆,修改mysql配置文件,在[mysqld]最后一行加skip-grant-tables即可登录 ...

  4. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  5. Linux强制用户首次登录修改密码

    一个执着于技术的公众号 地方 前言 Linux强制用户首次登陆修改密码,这应该是RHCE认证中用户管理部分, 属于很基础的内容了.可是我忘记了,所以就有了下面的记录~ 实验过程 1.创建用户并设置登录 ...

  6. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  7. openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等

    openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室. 虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下 ...

  8. openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)

    一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...

  9. openfire Android学习(五)------连接断开重连

    首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...

随机推荐

  1. Centos 7下利用crontab定时执行任务详解

    一 cron服务 cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond ...

  2. JS页面快捷键库hotkeys.js

    网友提供了一个好用的快捷键库,没有任何依赖,这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb). 这里也要特别感谢园友kacper的提醒与提供 ...

  3. [转] 在vue中使用SockJS实现webSocket通信

    最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,这就需要和服务器端建立webSocket连接,从而实现数据的实时获取和视图的实时刷新.在此将我的实现记录下来,希望可以给有同样需求的人一些帮助 ...

  4. Notepad++ WebEdit插件

    虽然PHP的IDE有很多,但是,我还是比较喜欢用Notepad++这款编辑器,因为比较轻量级,而且用起来比较顺手. 但是最近在改别人写的代码的时候,经常要在选定的php前后插入<?php  ?& ...

  5. 大数据学习——sparkRDD

    https://www.cnblogs.com/qingyunzong/p/8899715.html 练习1:map.filter //通过并行化生成rdd val rdd1 = sc.paralle ...

  6. Ext.js二级联动

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link href ...

  7. 【LeetCode】Reverse Integer(整数反转)

    这道题是LeetCode里的第7道题. 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 ...

  8. Jeddict:从服务器的验证过程,思考学习新事物的套路

    结合一路研究Jeddict使用的过程经验来看,在这里说一下关于服务器配置的东西.在我们团队,最开始用这个插件的时候,因为公司用的应用服务器是Jboss EAP 7,所以,我们自然而然的,想当然的直接使 ...

  9. PTA 11-散列2 Hashing (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/679 5-17 Hashing   (25分) The task of this pro ...

  10. 【CCF】商路

    [60分] #include<iostream> #include<cstdio> #include<cstring> #include<string> ...