XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通讯标准而提出来的,最先是在Jabber上实现的。它继承了在XML环境中灵活的发展性。所以,基于XMPP的应用具备超强的可扩展性。而且XML很易穿过防火墙,因此用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP做为通用的传输机制,不一样组织内的不一样应用均可以进行有效的通讯。android
这篇文章有基本的介绍,http://blog.csdn.net/xutaozero21/article/details/4873439api
Instant Messenger,及时通讯软件,就是你们使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基于XMPP 协议的一个实现,其余的则不是。当前IM 几乎做为每一个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,可是其商业价值还没彻底发挥出来。设想既然XMPP 协议是一个公开的协议,那么每一个企业均可以利用它来开发适合自己企业工做,提升自身生产效率的IM;甚至,你还能够在网络游戏中集成这种通讯软件,不但让你能够边游戏边聊天,也能够开发出适合游戏自己的IM 应用,好比说一些游戏关键场景提醒功能,团队语音交流等等均可以基于IM来实现。安全
这里使用openfire、smack和spark,完成xmpp IM实现,这里简单介绍一下这3个的做用:服务器
openfire主要是做为服务器,负责管理客户端的通讯链接,以及提供客户端一些通讯信息和链接信息。网络
Smack主要是xmpp协议的实现,提供了一套很好的api,因此下面操做xmpp都是经过使用smack的api来实现,固然由于是在android里,因此使用的是asmack这个包,里面方法跟smack包差很少。jsp
Spark 是IM客户端的实现,其实就是使用了smack 的api实现的。ide
//配置文件 参数(服务地地址,端口号,域)
ConnectionConfiguration configuration = new ConnectionConfiguration("192.168.0.110",5222,"");
//设置不须要SAS验证
configuration.setSASLAuthenticationEnabled(false);
//设置安全类型
configuration.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
//创建链接
XMPPConnection conn = new XMPPConnection(configuration);
注册有两种方法:工具
一种是用createAccount ,不过我测试了一下发现不能建立用户,具体缘由不详,下面介绍第二种。测试
AccountManager accountManagerconn.getAccountManager();
try {
= accountManager"saliya", "123456");
} catch (XMPPException e) {
e.printStackTrace();
} .createAccount(
一种是经过Registration类进行字体
Registrationnew reg = Registration;
//设置类型
reg.setType(IQ.Type.SET);
//发送到哪
reg.setTo(conn.getServiceName());
//设置用户名
reg.setUsername("keven1");
//设置密码
reg.setPassword("123456");
//设置其他属性(可选)
reg.addAttribute("android", "geolo_createUser_android");
//建立包过滤器
PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()), new PacketTypeFilter(IQ.class));
//建立包收集器
PacketCollector collector = conn.createPacketCollector(filter);
//发送包
conn.sendPacket(reg);
//获取返回信息
IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
// 取消收集
collector.cancel();
//经过返回信息判断
if (result == null) {
Toast.makeText(getApplicationContext(),"服务器异常" ,Toast.LENGTH_SHORT).show();
} else if (result.getType() == IQ.Type.ERROR) {
if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
Toast.makeText(getApplicationContext(),"注册失败,用户已存在" , Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
}
} else if (result.getType() == IQ.Type.RESULT) {
Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
} ()
一、登陆
conn.login("kooeasy","********");
二、获取联系人
Roster roster = conn.getRoster(); //获取名册
Collection<RosterEntry> entries = roster.getEntries(); //获取联系人
三、获取名片
//建立名片
VCard vCard = new VCard();
//加载名片(链接,用户)
try {
vCard.load(conn, user);
//获取头像
ByteArrayInputStream inputStream = new ByteArrayInputStream(vCard.getAvatar());
Bitmap mAvatar = BitmapFactory.decodeStream(inputStream);
...
} catch (XMPPException e) {
e.printStackTrace();
}
四、添加好友、分组
Roster roster = conn.getRoster(); roster.createGroup("group"); try { roster.createEntry("userName","user",new String[]{"Group"}); roster.removeEntry(); } catch (XMPPException e) { e.printStackTrace(); }
//建立聊天管理器
ChatManager chatManager = conn.getChatManager();
//建立一个聊天:(用户,聊天监听)再此添加聊天监听没法监听Bug?
Chat msg = chatManager.createChat(user, null);
//给聊天管理器添加了聊天监听
chatManager.addChatListener(new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean b) {
//给聊天,添加监听
chat.addMessageListener(new MessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
Log.i("MSG", message.getBody());
}
});
}
});
try {
//开始发送消息
msg.sendMessage("你好 能收到吗?");
} catch (XMPPException e) {
e.printStackTrace();
}
关于Smack
XMPP——Smack[2]会话、消息监听、字体表情和聊天窗口控制