以前学习过用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配置jdk

    ########## config jdk ########## export JAVA_HOME=/usr/local/java/jdk1.7.0_79 export CLASSPATH=.:${J ...

  2. 下载linaro android 4.4.2 for panda4460

    $ export MANIFEST_REPO=git://android.git.linaro.org/platform/manifest.git$ export MANIFEST_BRANCH=li ...

  3. LA 4094 WonderTeam 构造

    题意: 一共有\(n\)支队伍参加比赛,每两支队伍比赛两场,主客场各一场. 胜场得\(3\)分,平局得1分,败场不得分. 一支得分为\(p\)的队伍的排名\(=\)分数大于\(p\)的队伍数\(+1\ ...

  4. 03011_HttpServletRequest

    1.HttpServletRequest概述 (1)我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代 ...

  5. ubuntu linux下各种格式软件包的安装卸载

    http://www.cnblogs.com/mo-beifeng/archive/2011/08/14/2137954.html

  6. python-网络编程-03

    首先我们可以看下可以最简单的交互性的服务端和客户端程序 server import socket def main(): sock = socket.socket(socket.AF_INET,soc ...

  7. Android library projects cannot be launched解决方法

    着了一个例子项目,总是报标题说的错误. 解决方法如下: 红圈的地方,勾掉. 貌似如果你这个项目是作为一个被引用的project的话, 要勾上这个.单独作为一个app的话,不能勾选这个. --不懂,瞎写 ...

  8. Map容器——TreeMap及常用API,Comparator和Comparable接口

    TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap), ...

  9. iOS-----openGL--openGL ES iOS 入门篇3---> 纹理贴图(texture)

    在这篇文章中,我们将学习如何在openGL中使用纹理贴图. penGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类.由于本文将以一张图片为例,因此我们为我们的纹理对象 ...

  10. POJ3349 Snowflake Snow Snowflakes 【哈希表】

    题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...