Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
http://blog.csdn.net/h7870181/article/details/8653865
以前学习过用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为服务器端口号
- /**
- * 连接服务器
- *
- * @return
- */
- public boolean conServer() {
- ConnectionConfiguration config = new ConnectionConfiguration(
- 127.0.0.1, 5222);
- /** 是否启用安全验证 */
- config.setSASLAuthenticationEnabled(false);
- /** 是否启用调试 */
- // config.setDebuggerEnabled(true);
- /** 创建connection链接 */
- try {
- connection = new XMPPConnection(config);
- /** 建立连接 */
- connection.connect();
- return true;
- } catch (XMPPException e) {
- e.printStackTrace();
- }
- return false;
- }
/**
* 连接服务器
*
* @return
*/
public boolean conServer() {
ConnectionConfiguration config = new ConnectionConfiguration(
127.0.0.1, 5222);
/** 是否启用安全验证 */
config.setSASLAuthenticationEnabled(false);
/** 是否启用调试 */
// config.setDebuggerEnabled(true);
/** 创建connection链接 */
try {
connection = new XMPPConnection(config);
/** 建立连接 */
connection.connect();
return true;
} catch (XMPPException e) {
e.printStackTrace();
}
return false;
}
第二、实现注册
关键代码:
以下代码注释都很清楚了,如有不懂的地方可以留言,这里就不多做解释了。
- /**
- * 注册
- *
- * @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";
- } else if (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 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";
} else if (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
- */
- public boolean login(String a, String p) {
- try {
- if (connection == null)
- return false;
- /** 登录 */
- connection.login(a, p);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
/**
* 登录
*
* @param a 登录帐号
* @param p 登录密码
* @return
*/
public boolean login(String a, String p) {
try {
if (connection == null)
return false;
/** 登录 */
connection.login(a, p);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
第四、修改密码
关键代码:同样很简单
- /**
- * 修改密码
- * @param connection
- * @return
- */
- public static boolean changePassword(XMPPConnection connection,String pwd)
- {
- try {
- connection.getAccountManager().changePassword(pwd);
- return true;
- } catch (Exception e) {
- return false;
- }
- }
/**
* 修改密码
* @param connection
* @return
*/
public static boolean changePassword(XMPPConnection connection,String pwd)
{
try {
connection.getAccountManager().changePassword(pwd);
return true;
} catch (Exception e) {
return false;
}
}
第五、更改用户状态
关键代码:好吧,代码有点多,不过很清晰
- /**
- * 更改用户状态
- */
- public void setPresence(int code) {
- if (connection == null)
- return;
- Presence presence;
- switch (code) {
- case 0:
- presence = new Presence(Presence.Type.available);
- connection.sendPacket(presence);
- Log.v("state", "设置在线");
- break;
- case 1:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.chat);
- connection.sendPacket(presence);
- Log.v("state", "设置Q我吧");
- System.out.println(presence.toXML());
- break;
- case 2:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.dnd);
- connection.sendPacket(presence);
- Log.v("state", "设置忙碌");
- System.out.println(presence.toXML());
- break;
- case 3:
- presence = new Presence(Presence.Type.available);
- presence.setMode(Presence.Mode.away);
- connection.sendPacket(presence);
- Log.v("state", "设置离开");
- System.out.println(presence.toXML());
- break;
- case 4:
- 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());
- }
- // 向同一用户的其他客户端发送隐身状态
- presence = new Presence(Presence.Type.unavailable);
- presence.setPacketID(Packet.ID_NOT_AVAILABLE);
- presence.setFrom(connection.getUser());
- presence.setTo(StringUtils.parseBareAddress(connection.getUser()));
- connection.sendPacket(presence);
- Log.v("state", "设置隐身");
- break;
- case 5:
- presence = new Presence(Presence.Type.unavailable);
- connection.sendPacket(presence);
- Log.v("state", "设置离线");
- break;
- default:
- break;
- }
- }
/**
* 更改用户状态
*/
public void setPresence(int code) {
if (connection == null)
return;
Presence presence;
switch (code) {
case 0:
presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
Log.v("state", "设置在线");
break;
case 1:
presence = new Presence(Presence.Type.available);
presence.setMode(Presence.Mode.chat);
connection.sendPacket(presence);
Log.v("state", "设置Q我吧");
System.out.println(presence.toXML());
break;
case 2:
presence = new Presence(Presence.Type.available);
presence.setMode(Presence.Mode.dnd);
connection.sendPacket(presence);
Log.v("state", "设置忙碌");
System.out.println(presence.toXML());
break;
case 3:
presence = new Presence(Presence.Type.available);
presence.setMode(Presence.Mode.away);
connection.sendPacket(presence);
Log.v("state", "设置离开");
System.out.println(presence.toXML());
break;
case 4:
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());
}
// 向同一用户的其他客户端发送隐身状态
presence = new Presence(Presence.Type.unavailable);
presence.setPacketID(Packet.ID_NOT_AVAILABLE);
presence.setFrom(connection.getUser());
presence.setTo(StringUtils.parseBareAddress(connection.getUser()));
connection.sendPacket(presence);
Log.v("state", "设置隐身");
break;
case 5:
presence = new Presence(Presence.Type.unavailable);
connection.sendPacket(presence);
Log.v("state", "设置离线");
break;
default:
break;
}
}
第六:注销
关键代码:很简单吧!
- /**
- * 删除当前用户
- * @param connection
- * @return
- */
- public static boolean deleteAccount(XMPPConnection connection)
- {
- try {
- connection.getAccountManager().deleteAccount();
- return true;
- } catch (Exception e) {
- return false;
- }
- }
/**
* 删除当前用户
* @param connection
* @return
*/
public static boolean deleteAccount(XMPPConnection connection)
{
try {
connection.getAccountManager().deleteAccount();
return true;
} catch (Exception e) {
return false;
}
}
好吧,这篇就先介绍到这!
Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等的更多相关文章
- Android基于XMPP Smack Openfire下学习开发IM(六)总结
不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java package com.techrare.utils; import ...
- Android基于XMPP Smack Openfire下学习开发IM(五)连接断开重连
学习过程中大家都碰到过连接被断开的问题给困扰吧,下面教大家如何做到连接断开后,重新连接 首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面 ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
- Android基于XMPP Smack及Openfire学习笔记(1)
之前开发的项目中实用到IM聊天功能.可是这块功能公司有专门的IM团队来开发,由他们开发好后.直接接入到我们APP中.我參与写IM相关功能非常地少,所以也一直想学习相关知识 . 眼下Android主要用 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- Android基于XMPP的即时通讯2-文件传输
本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输 1.初始化文件传输管理类 public static FileTransferManager get ...
- Android基于XMPP的即时通讯3-表情发送
这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...
- MVC5 网站开发之六 管理员 1、登录、验证和注销
上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录.验证和注销功能. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MV ...
- mysql5.7 mysql库下面的user表没有password字段无法修改密码
如题所述,mysql5.7 mysql库下面的user表没有password字段无法修改密码, 5.7版本已经不再使用password来作为密码的字段了 而改成了authentication_st ...
随机推荐
- 【BZOJ1054】移动玩具(搜索)
[BZOJ1054]移动玩具(搜索) 题面 BZOJ 洛谷 题解 这种小清新搜索题写出来好舒服啊. 要是原来的我来写代码肯定又臭又长吧.. #include<cstdio> #includ ...
- MySQL事务及隔离级别(读书小结)
标签: MySQL事务 隔离 0.什么是事务? 事务是指MySQL的一些操作看做是一个不可分割的执行单元.事务的特点是要么所有操作都执行成功,要么一个都不执行.也就是如果一个事务有操作执行失败,那么就 ...
- 深度学习网络层之 Pooling
pooling 是仿照人的视觉系统进行降维(降采样),用更高层的抽象表示图像特征,这一部分内容从Hubel&wiesel视觉神经研究到Fukushima提出,再到LeCun的LeNet5首次采 ...
- Long与long的区别
Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,S ...
- centos禁用ipv6
两步完成 vi /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6=1sysctl -p /etc/sysctl.conf
- 《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- Oracle的基本语法,存储函数及触发器
1.PL/SQL PL/SQL是Oracle对 ql语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句,使SQL语言具有过程处理能力.把 SQL 语言的数据操纵能 力与过程语言的数据 ...
- Shell记录-Shell命令(find)
Linux中的find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花 ...
- PHP运算符的规律
^异或的规律:只有真真和假假位假 !非 判断失误的另一名比如true是false &只要有真都为真就是真其他都是假 $$就是左边是真的就不判断了 规律是一样的 |或只有假假都为假其他都是真
- ajax状态码--转他人的
var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } ...