Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中實現自定義XMPP消息包收發

Android中實現自定義XMPP消息包收發

編輯:關於Android編程

在Android平台實現XMPP即時通訊主要是使用asmack這個包,asmack是XMPP協議的實現。但是asmack只能幫助我們實現一些基本消息包的收發,如果需要實現特定的自定義消息包收發需要我們自己處理。


一、asmack消息的發送和接收

發送Message消息:

發送一個message結的消息,可以使用sendMessage()發送消息,這個方法有兩個重載方法,一種類型的參數是String類型,另一種則是傳入Message對象。String類型的方法傳入的字符串即為要發送的消息;傳入message對象的方需要寫一個類繼承Message,重寫toXML()方法,toXML()方法的返回值即為要發送的消息。例如:


    //1、通過傳入String類型的sendMessage()方法發送消息:

    ChatManager chatManager = xmppConnection.getChatManager();
     /**
         * String userJID 對方的JID
         * MessageListener listener 消息監聽,當收到消息後會回調processMessage(Chat chat, Message message)方法
         */
    Chat mChat = chatManager.createChat(mToUser, this);
    mChat.sendMessage("your content");
    //2、通過傳入Message對象的sendMessage()方法發送消息:

    /**
    *寫一個類繼承Message重寫toXML()方法,方法的返回值即為要發送的消息
    */
    public class MyMessage extends Message {

         @Override
        public String toXML() {

            return "your content";
        }

    }

    ChatManager chatManager = xmppConnection.getChatManager();
     /**
         * String userJID 對方的JID
         * MessageListener listener 消息監聽,當收到消息後會回調processMessage(Chat chat, Message message)方法
         */
    Chat mChat = chatManager.createChat(mToUser, this);
    MyMessage myMessage = new MyMessage();
    mChat.sendMessage(myMessage);
接收Message消息:

接收Message類型的消息主要是在processMessage(Chat chat, Message message)方法中,當收到消息後都會回調這個方法,需要實現MessageListener這個接口,然後實現接口中的processMessage(Chat chat, Message message)方法。


二、發送和接收自定義類型的IQ結消息

當發送的iq消息中包含自定義的xml結的時候,asmack提供的解析並不能識別這些自定義的xml結,所以就需要我們自己實現消息包的解析和拼裝。

1、發送含自定義xml結的iq消息。

例如發送這樣一個iq消息:

發送步驟:


    //步驟:
    //1、寫一個類繼承IQ並重寫getChildElementXML()方法,該方法的返回值將作為消息體。
    public class MyIQ extends IQ {
        @Override
        public String getChildElementXML() {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("<req var='read'>< attr var='temprature'/></req>");
            return stringBuilder.toString();
        }
    }
    //2、發送這個含自定義xml結的iq消息包
    MyIQ packet = new MyIQ();
    packet.setType(IQ.Type.GET);//設置IQ結type
    packet.setFrom("client@xmpp/B");//設置IQ結from
    packet.setTo("client2@xmpp/s2");//設置IQ結to
    xmppConnection.sendPacket(packet);//發送消息包

2、解析服務器返回的iq消息包,消息包中含自定義xml結。

例如解析服務器返回的這樣一個iq消息:

17

解析步驟:


    //步驟:
    //1、寫一個類 implements PacketListener接口並實現其中的processPacket(Packet packet)方法。
    public class MyPacketListener implements PacketListener {
        @Override
        public void processPacket(Packet packet) {
            //當收到消息包就會回調該方法
        }
    }
    //2、添加包監聽器
    MyPacketListener mMyPacketListener = new MyPacketListener();
    //該方法有兩個參數
    //第一個參數:    PacketListener  包監聽器
    //第二個參數:   PacketFilter  包過濾器
    xmppConnection.addPacketListener(mMyPacketListener, null);
    //完成以上兩步後,當收到消息包都會回調MyPacketListener中的processPacket(Packet packet)方法。
    //3、寫一個類繼承IQ並實現getChildElementXML()方法。
    public class GetDataResp extends IQ {
        //例如我們要獲取上面iq消息包中的temprature和17兩個屬性,所以將這兩個值聲明為成員變量,並生成get和set方法。
        public String var;
        public String value;
        public String getVar() {return var;}
        public void setVar(String var) {this.var = var;}
        public String getValue() {return value;}
        public void setValue(String value) {his.value = value;}
        @Override
        public String getChildElementXML(){
            //拼裝消息
            StringBuilder buf = new StringBuilder();
            buf.append("<resp xmlns='get:data'><attr var='");
    ·       buf.append(getVar());
            buf.append("'>");
            buf.append(getValue());
            buf.append("</attr></resp>");
            return buf.toString();
        }
    }
    //4、寫一個類implements IQProvider並實現接口中的parseIQ(XmlPullParser parser)方法。
    public class GetDataRespProvider implements IQProvider {
        @Override
        public IQ parseIQ(XmlPullParser parser) throws Exception {
            GetDataResp getDataResp = new GetDataResp();//這個對象是上面第三步中的那個類對象
            boolean done = false;
            while (!done) {
                int eventType = parser.next();
                if (eventType == XmlPullParser.START_TAG) {
                    if (parser.getName().equals("attr")) {
                        String var = parser.getAttributeValue("", "var");//獲取var屬性的value即:temprature
                        String value = parser.nextText();//獲取attr的文本即:17
                        getDataResp.setVar(var);
                        getDataResp.setValue(value);
                    }
                }else if (eventType == XmlPullParser.END_TAG) {
                    if (parser.getName().equals("resp")) {
                        done = true;
                    }
                }
            }
             return getDataResp;
        }
    }
    //5、在配置ConnectionConfiguration時添加IQProvider
    //第一個參數是:String 元素的名稱
    //第二個參數是:String  命名空間
    //第三個參數是:Object  需要傳入一個prvider對象
    ProviderManager.getInstance().addIQProvider("resp", "data", new GetDataRespProvider());
    //6、在第一步MyPacketListener中的processPacket(Packet packet)方法中獲取相應消息包
    public class MyPacketListener implements PacketListener {
        @Override
        public void processPacket(Packet packet) {
            if (packet instanceof GetDataResp) {
                GetDataResp getDataResp = (GetDataResp) packet;
                String from = getDataResp.getFrom();
                String to = getDataResp.getTo();
                String var = getDataResp.getVar();
                String value = getDataResp.getValue();
            }
        }
    }

三、總結

發送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。 如果需還需要實現一些自定義的解析,可以修改asmack源碼中的PacketParserUtils這個類中對應的方法。

下面是源碼地址:

點擊:下載地址

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved