0

XMPP Android基础介绍

XMPP Android基础介绍

在android中使用到的库为Asmack(下载地址:http://code.google.com/p/asmack/)

Asmack的相关介绍
1.ConnectionConfiguration 通过该类设置用于与XMPP服务器建立连接的配置。它能配置连接是否使用TLS、SASL加密等
2.XMPPConnection 通过该类连接XMPP服务。通过connect()建立连接disconnect()断开连接
3.ChatManager 用于监控当前所有Chat,可以使用createChat(String userJID,MessageListener listener)创建一个聊天
4.Chat 用于监控两个用户间的一系列消息。使用addMessageListener(MessageListener listener),当有任何消息到达时将会触发listener的processMessage(Chat chat,Message msg)方法。
5.Message 用来表示一个消息包。Message有2个内部类Message.Body表示消息体,Message.Type消息类型
(1)Message.Type.NORMAL 默认文本消息
(2)Message.Type.CHAT 典型的短消息,如QQ聊天时一行一行的显示消息
(3)Message.Type.GROUP_CHAT 群聊消息
(4)Message.Type.HEADLINE 滚动显示消息
(5)Message.Type.ERROR 错误消息
6.Roster 表示存储了一个花名册,其中包含很多RosterEntry。为了易于管理,花名册的项被分配到了各个group中,当建立与XMPP服务的连接后可以使用connection.getRoster()获得Roster对象。别的用户可以使用一个订阅请求(相当于QQ添加好友)尝试订阅目的用户。可以使用Roster.SubscriptionMode的值处理这些请求,accept_all表示接收所有订阅请求,reject_all表示拒绝所有订阅请求,manual表示手工处理订阅请求。
//创建组的方法
RosterGroup group=roster.createGroup(“同事”);
//可以向组中添加RosterEntry对象
group.addEntry(entry);
7.RosterGroup表示Roster中的每条记录,它包含了用户的JID、用户名、用户分配的昵称。
8.RosterGroup表示RosterEntry的组。可以使用addEnty(RosterEntry entry)添加,contains(String user)判读某用户是在组中,removeEntry(RosterEnty entry)从组中移除,getEntries()获取所有RosterEntry
9.Presence表示XMPP状态的packet,每个presence packet都是一个状态,用户枚举类型Presence.Type的值表示。
Presence.Type值
(1)available 用户空闲状态
(2)unavailable 用户没空看消息
(3)subscribe 请求定义别人,即请求加对方为好友
(4)subscribed 统一被别人订阅,也就是确认被对方加为好友
(5)unsubscribe 取消订阅别人,请求删除某好友
(6)unsubscribed 拒绝被别人订阅,即拒绝对方的添加请求
(7) error 当前状态packet有错误
登陆XMPP服务器
首先创建用户,然后建立与XMPP服务器的连接,最后使用用户登陆到XMPP服务器
//指定连接到服务器的参数
ConnectionConfiguration mConnectionConfiguration=new ConnectonConfiguration(“192.168.1.105”,5222);
//初始化XMPPconnection连接
XMPPConnection mXMPPConnection=new XMPPConnection(mConnectionConfiguration);
//连接上XMPP服务器
try{
mXMPPConnection.connect();
//实例化用户管理
AccountManager mAccountManager=mXMPPConnection.getAccountManager();
//用指定的用户名和密码创建用户
mAccountManager.createAccount(‘zhang’,’123456′);
}catch(XMPPException e){

}
登陆之前要和XMPP建立连接。XMPPConnection类用来建立到XMPP服务器的连接。要建立SSL连接使用SSLXMPPConnection
//建立一个到服务器的连接
XMPPConnection connl=new XMPPConnection(“hostname”);
//通过一个特殊的端口建立一个服务器的连接
XMPPConnection connl=new XMPPConnection(“hostname”,5222);
//建立一个到服务器的SSL连接
XMPPConnection connl=new SSLXMPPConnection(“hostname”);
登陆代码如下:
//指定连接到服务器的参数
ConnectionConfiguration mConnectionConfiguration=new ConnectonConfiguration(“192.168.1.105”,5222);
//初始化XMPPconnection连接
XMPPConnection mXMPPConnection=new XMPPConnection(mConnectionConfiguration);
//连接上XMPP服务器
try{
mXMPPConnection.connect();
//使用指定的用户名和密码登录
mXMPPConnection.login(‘zhang’,’123456′);
//mXMPPConnection。disconnect()表示下线
}catch(XMPPException e){

}
如果考虑登陆进去,但是显示不在线可以使用
//Presence类可以设置用户的是否在线的类型属性
Presence mPresence=new Presence(Presence.Type.unavailable);
//向服务器提交该属性
mXMPPConnection.sendPacket(mPresence);

联系人相关操作
1.获取联系人列表
Asmack中的Roster对象能够跟踪其他用户的有效性,联系人列表需要列表引用Roster。一个Roster实例通过XMPPConnection.getRoster()方法获得。需要注意的是只有在成功登陆服务器后才能用该方法。
在Roster中每个用户用一个RosterEntry表示,它包括了用户的XMPP地址、用户的昵称
//新建Roster对象
Roster roster=mXMPPConnection.getRoster();
//获得联系人列表集合
Collection<RosterEntry> rg=roster.getEnteries();
2.获得联系人状态
//获取好友状态对象
Presence presence = roster.getPresence(rosterEntry.getUser());
//获得好友状态
pressence.getStatus();

设置状态的方法
//新建状态
Presence mPressence=new Presence(Presence.Type.available);
//设置状态信息
mPresence.setStatus(“set My Status here”);
//发送配置包,设置在线状态
mXMPPConnection.sendPacket(mPresence);
3.添加和删除联系人
//新建Roster对象
Roster roster=mXMPPConn
ection.getRoster();
try{
//添加联系人 3个参数分别问:用户名,昵称,和分组
roster.createEntry(“zhang@192.168.1.105″,”小伙”,String[]{“friends”});
//删除联系人
//roster.removeEntry(roster.getEntry(“zhang@192.168.1.105″));
}catch(XMPPException e){

}
4.监听联系人添加信息
收到订阅请求时候的XMPP信息如下
<presence id=”rm1952_24″ to=”newuser@stonechen” from=”user@stonechen” type=”subscribed” ></presence>
收到被删除订阅的时候的XMPP信息如下:
<presence id=”newuser@stonechen” from=”user1@stonechen” type=”unsubscribe”></presence>
下面是添加监听的核心代码
//添加监听联系人信息
private static void addListener(){
//新建过滤消息
PacketFilter fileterMessage=new PacketFilter(Presence.class);
//创建监听器
PacketListener myListener=new PacketListener(){
public void processPacket(Packet packet){
//消息包赋值给一个新的Presence
final Presence mPressence=(Presence)packet;
if(mPresence.getType().equals(Presence.Type.subscribe)){
//收到请求订阅的信息,可以在该处处理
}else if(mPresence.getType().equals(Presence.Type.unsubscribe)){
//收到取消订阅的信息,可以在该处处理
}
//packet.toXML();可以将接收到是信息转换为XML字符串
}
}
}
消息处理
发送和接收消息是即时通信的核心地位,类org.jivesoftware.smack.Chat用于在两个联系人之间发送和接收消息
//接收消息
private static void addMessageListener(){
//添加消息监听
mXMPPConnection.getChatManager().addChatListener(new ChatMessageListener(){
//创建消息
public void chatCreated(Chat mChat,boolean createLocally){
//检测消息来源是否为本地发出的
//这里为接收到的消息
if(!createdLocally){
//监听接收到的消息
mChat.addMessageListener(new MessageListener(){
//添加消息处理
public void proceesMessage(Chat mChat,Message mMessage){
//打印接收到的消息
//message.getBody();
}
});
}

}
});
}

发送消息

一个chat在两个用户之间创建一个消息线程。
//新建一个消息线程
Chat chat=mXMPPConnection.getChatManager()
//指定接收人,并添加消息监听
.createChat(“user1@stonechen”,new MessageListener(){
//处理消息
public void processMessage(Chat chat,Message message){
//打印接收的消息 message
}
});

//创建一个新的消息
try{
Message newMessage=new Message();
//设置消息内容
newMessage.setBody(“hello world”);
//发送消息
chat.sendMessage(newMessage);
}catch(XMPPException e){

}

聊天室
XMPP的xep0045规范给出了多人聊天(MUC,Multi-User Chat)方法,查看MUC协议文本的网址 http://xmpp.org/extensions/xep-0045.html
XMPP通过Instant room和Reserved rooms创建多人聊天。
步骤1.创建MultiUserChat实例,聊天室名称通过构造方法创建给要创建的聊天室
步骤2.调用MultiUserChat的create(String nickName)方法,在这里nickname是用户加入聊天室的用户昵称
步骤3.创建一个Instant room,调用sendConfigurationFrom(From form)方法,在这里表单是一个空表单,创建一个Reserved room应该首先获得聊天室的配置表单,完成表单将发送回服务器。
创建Instant room核心代码
//使用XMPPConnection创建一个MultiUserChat
try{
//初始化MultiUserChat对象
MultiUserChat muc=new MultiUserChat(mXMPPConnection,”newroom1@confenrence.stonechen”);
//创建聊天室
muc.create(“newroom1″);
//发送一个空表单配置,这显示我们想要一个Instant room
muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
}catch(XMPPException e){

}

创建reserved room
try{
//初始化MultiUserChat对象
MultiUserChat muc=new MultiUserChat(mXMPPConnection,”newroom2@confenrence.stonechen”);
//创建聊天室
muc.create(“newroom2”);
//获得聊天室的配置表单
Form form=muc.getConfigurationForm();
//根据原始表单穿件一个要提交的新表单
Form submitForm=form.createAnswerForm();
//向要提交的表单添加默认答复
for(Interator fields=form.getFields();fields.hasNext()){
FormField field=(FormField) fields.next();
if(!FormField.TYPE_HIDDEN.equals(fields.getType())&&field.getVariable()!=null){
//设置默认值作为答复
submitForm.setDefaultAnswer(field.getVariable());
}
}
//设置聊天室的新拥有者
List oweners=new ArrayList();
oweners.add(“NewUser@stonechen”);
submitForm.setAnswer(“muc#foomconfig_roomowners”,oweners);
//发送已完成的表单(有默认值)到服务器来配置聊天室
muc.sendConfigurationForm(submitForm);
}catch(XMPPException e){

}

注意:更多问题参考官方网站http://community.igniterealtime.org/htread/31118

加入聊天室
步骤1.创建一个MultiUserChat的实例,把要加入的聊天室的名称传递给构造方法。
步骤2.嗲用MultiUserChat的join方法。如果想要加入需啊哟密码才能加入的聊天室使用join(nickname,password);

//使用XMPPConnection创建一个MultiUserChat
MultiUserChat muc2=new MultiUserChat(connl,”newroom@conference.stonchen”);
//加入
muc2.join(“user2”);
//muc2.join(“user2″,password);

发送和技术消息
try{
//使用XMPPConnection创建一个MultiUserChat
MultiUserChat muc2=new MultiUserChat(connl,”newroom@conference.stonchen”);
//用户加入新聊天室,参数为用户的聊天室的昵称
muc2.join(“newMucUser”);
Message newMessage=muc2.createMessage();
//设置聊天信息
newMessage.setBody(“Hello MUC!”);
//发送聊天信息
muc1.sendMessage(newMessage);
}catch(XMPPException e){

}
接收消息

//使用XMPPConnection创建一个MultiUserChat
MultiUserChat muc2=new MultiUserChat(connl,”newroom@conference.stonchen”);
try{
//用户加入新聊天室,参数为用户的聊天室的昵称
muc2.join(“newMucUser”);
}catch(XMPPException e){
}
//添加监听
muc2.addMessageListener(new PacketListenr(){
public void processPacket(Packet packet){
//此处对收到的消息进行处理
Log.e(“processPacket message”,packet.toXML());
}
}):

转载注明:http://blog.etongwl.com/?p=651

天边的星星