XMPP技術之Smack庫的自定義消息擴展

寫此文是爲了記念我耗時兩天的Smack庫應用開發。app

太苦惱了,網上找了一堆材料,關於XMPP的消息擴展方面的資料感受都是出於同一個源頭,基本問題仍是基於的庫版本都是低於4.1版本的講解。ide

我是在Smack4.3版本上作應用開發的,因此即使看到這些資料對Message 和Extension的概念闡述已經頗爲詳細和易懂了,可是在個人項目中就是沒法成功發送和接收到自定義消息擴展。ui

固然,咱們這裏不賣關子,直接指明:根本緣由是Smack4.2及之後版本對於擴展消息的XML書寫更規範了,之前的寫法就不合乎它的要求了。故而,發送端發不出擴展消息XML標籤內容、接收端只能收到body消息體。this

 

多說無益,這裏把須要注意的關鍵代碼列出了,但願能幫助到有須要的朋友們!spa

咱們的擴展消息定義:code

public class MyMessage implements ExtensionElement {

public static final String NAME = "xxx-demo";
public static final String NAME_SPACE = "xmpp:xxx:extension";

private String id = "";
private Integer status = 0;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public Integer getStatus() {
return status;
}

public void setStatus(Integer status) {
this.status = status;
}

@Override
public String getElementName() {
return NAME;
}

@Override
public String getNamespace() {
return NAME_SPACE;
}

@Override
public CharSequence toXML(String var1) {
StringBuilder buffer = new StringBuilder();
buffer.append("<");
buffer.append(NAME);

buffer.append(" ");
buffer.append("xmlns='");
buffer.append(NAME_SPACE);
buffer.append("'");

buffer.append(">");

buffer.append("<").append("id").append(">").append(id).append("</").append("id").append(">");
buffer.append("<").append("status").append(">").append(status.toString()).append("</").append("status").append(">");

buffer.append("</");
buffer.append(NAME);
buffer.append(">");

return buffer;
}
}

咱們的擴展消息解碼器xml

public class MyProvider extends ExtensionElementProvider {    @Override    public MyMessage parse(XmlPullParser parser, int initialDepth) throws Exception {        boolean done = false;        MyMessage mymsg = new MyMessage();        while (!done) {            int eventType = parser.next();            String name = parser.getName();//XML Tab標籤            if (eventType == XmlPullParser.START_TAG) {                if (name.equals("id")) {                    mymsg.setId(parser.nextText());                }                if (name.equals("status")) {                    mymsg.setStatus(Integer.parseInt(parser.nextText().trim()));                }            }            if (eventType == XmlPullParser.END_TAG) {                if (MyMessage.NAME.equals(name)) {                    done = true;                }            }        }        return mymsg;    }}最後:我這裏不是完整XMPP技術的介紹,也不是XMPP自定義消息的講解,只是假定你是XMPP技術應用開發者、之前用過XMPP自定義消息方面的功能、且是Java語言陣營的一員,那麼,對於這個問題你只須要看看我給出的這部分代碼,應該就能搞定Smack庫升級應用的問題了。---感謝關注,再會!
相關文章
相關標籤/搜索