以前学习过用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. MySQL-状态Waiting on empty queue引申

    MySQL 事件调度器示例演示 我们大家都知道MySQL 事件调度器是在 MySQL 5.1 中新生的一个较为特殊的功能,其可以作为定时任务调度器,来取代部分原先只能用操作系统任务调度器才能完成的定时 ...

  2. HDU 3667 费用流 拆边 Transportation

    题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...

  3. MyInt的简单实现

    #include <iostream> using namespace std; class CMyInt{ private: int value; public: CMyInt(int ...

  4. python面试题解析(数据库和缓存)

    1.     答: 关系型数据库:Mysql,Oracel,Microsoft SQL Server 非关系型数据库:MongoDB,memcache,Redis. 2.     答:     MyI ...

  5. 树链剖分 - Luogu 3384【模板】树链剖分

    [模板]树链剖分 题目描述 已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操 ...

  6. python week08 并发编程之多线程--实践部分

    一. threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pytho ...

  7. python 学习分享-字典篇

    python字典(Dictionary) dict是无序的 key必须是唯一切不可变的 a={'key1':'value1','key2':'value2'} 字典的增删改查 a['key3']='v ...

  8. 使mysql的表内容可以输入中文内容

    修改数据库的字符集mysql>use mydb mysql>alter database mydb character set utf8;

  9. 刷题总结——coneology(poj2932 扫描线)

    题目: Description A student named Round Square loved to play with cones. He would arrange cones with d ...

  10. nginx日志打印请求响应时间

    log_format  timed_combined  '$remote_addr - $remote_user [$time_local] "$request" ' '$stat ...