XMPP协议简介
XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。
这篇文章有基本的介绍,http://blog.csdn.net/xutaozero21/article/details/4873439
IM
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包差不多。
Spark 是IM客户端的实现,其实就是使用了smack 的api实现的。
ASmack 使用
一、连接服务器
//配置文件 参数(服务地地址,端口号,域)ConnectionConfiguration configuration = new ConnectionConfiguration("192.168.0.110",5222,"");//设置不需要SAS验证configuration.setSASLAuthenticationEnabled(false);//设置安全类型configuration.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
二、注册模块
注册有两种方法:
一种是用createAccount ,不过我测试了一下发现不能创建用户,具体原因不详,下面介绍第二种。
AccountManager ??accountManager?? = conn.getAccountManager();try { ??accountManager??.createAccount("saliya", "123456");} catch (XMPPException e) { e.printStackTrace();}
一种是通过Registration类进行
??Registration?? reg = new ??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();}
三、登录
1、登录
conn.login("kooeasy","********");
2、获取联系人
Roster roster = conn.getRoster(); //获取名册Collection<RosterEntry> entries = roster.getEntries(); //获取联系人
三、发送消息
//创建聊天管理器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 4.0