在Android平台实现XMPP即时通讯主要是使用asmack这个包,asmack是XMPP协议的实现。但是asmack只能帮助我们实现一些基本消息包的收发,如果需要实现特定的自定义消息包收发需要我们自己处理。
一、asmack消息的发送和接收
- 发送Message消息:
发送一个message结的消息,可以使用sendMessage()发送消息,这个方法有两个重载方法,一种类型的参数是String类型,另一种则是传入Message对象。String类型的方法传入的字符串即为要发送的消息;传入message对象的方需要写一个类继承Message,重写toXML()方法,toXML()方法的返回值即为要发送的消息。例如:
- 接收Message消息:
接收Message类型的消息主要是在processMessage(Chat chat, Message message)方法中,当收到消息后都会回调这个方法,需要实现MessageListener这个接口,然后实现接口中的processMessage(Chat chat, Message message)方法。
二、发送和接收自定义类型的IQ结消息
当发送的iq消息中包含自定义的xml结的时候,asmack提供的解析并不能识别这些自定义的xml结,所以就需要我们自己实现消息包的解析和拼装。
1、发送含自定义xml结的iq消息:
例如发送这样一个iq消息:<iq id='123' type='get' from='client@xmpp/B' to='client2@xmpp/s2'><req var='read'><attr var='temprature'/></req></iq>
|
|
2、解析服务器返回的iq消息包,消息包中含自定义xml结:
例如解析服务器返回的这样一个iq消息:<iq id='12' type='result' from='client2@xmpp/s2' to='client@xmpp/B'><resp xmlns='data'><attr var='temprature'>17</attr></resp></iq>
|
|
三、总结
- 发送message类型的消息中如果带有自定义xml结,需要写一个类继承Message并重写
toXML()方法,该方法的返回值便是消息体。 - 发送的iq类型的消息中如果带有自定义xml结,需要写一个类继承IQ并重写
getChildElementXML()方法,该方法的返回值将作为消息体 - 服务器返回的iq消息类型中如果带有自定义的xml结:
- 写一个类继承IQ并重写
getChildElementXML()方法,将服务器返回的消息中需要的信息做成成员变量,并拼装出消息体,最后作为返回值返回。 - 写一个类implements IQProvider并实现接口中的parseIQ(XmlPullParser parser)方法,然后在该方法中做出对应的解析过程,最后通过返回值返回上一个步骤中的IQ对象。
- 服务器返回的iq消息中的消息体必须带有命名空间。
- 需要通过这个方法
ProviderManager.getInstance().addIQProvider("resp", "data", new GetDataRespProvider());添加相应的IQProvider。
- 写一个类继承IQ并重写
- 如果需还需要实现一些自定义的解析,可以修改asmack源码中的
PacketParserUtils这个类中对应的方法。
下面是源码地址:
点击:下载地址