以前学习过用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. 用Comparator排序和分组

    Test实体 import java.util.Objects; /** * @author gallen * @description * @date 2018/11/16 * @time 18:5 ...

  2. 元类相关(type & metaclass)

    metaclass作用: 1) 拦截类的创建 2) 修改类 3) 返回修改之后的类 """为什么要用metaclass类而不是函数? 由于__metaclass__可以接 ...

  3. Leetcode 450.删除二叉搜索树的节点

    删除二叉搜索树的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用. 一般来 ...

  4. POJ 1609 Tiling Up Blocks

    Tiling Up Blocks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4675   Accepted: 1824 ...

  5. R语言处理1975-2011年的人口信息

    1975-2011年的数据中. 1)分别统计每年人口最多的国家是哪个?有多少 2)统计出各个国家的1975-2011年的平均人口增长率 3)统计每年人口最多的十个国家 4)统计出每年人口最少的十个国家 ...

  6. 在 Ubuntu 16.04 上安装 Eclipse Oxygen

    2017 年 6 月 28 日,Eclipse 社区(the Eclipse Community)发布了 Eclipse Oxygen.本文记录了我在 Ubuntu 16.04 上安装 Eclipse ...

  7. BZOJ4556 [Tjoi2016&Heoi2016]字符串 【后缀数组 + 主席树 + 二分 + ST表】

    题目 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...

  8. 浅谈android反调试之 转发端口

    反调试方案: 我们最通常使用的动态工具是IDA, IDA的动态调试端口默认为23946,我们可以通过/pro/net/tcp 查看android 系统所有TCP Socket 启动android_se ...

  9. [暑假集训--数论]poj2657 Comfort

    Description A game-board consists of N fields placed around a circle. Fields are successively number ...

  10. poj 3246 Game

    Game Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 2707   Accepted: 488 Description W ...