xmpp Smack中如何自定义发送的消息xml格式?

前言

参考:
怎么自定义message格式?

好了,下面正文:

正文

请看下面的伪代码,

Message message = new Message();
message.setStanzaId("923442621149");
message.setType(Message.Type.normal);
message.setBody("shanraisshan");
Log.e("message --->", message.toXML().toString());

在smack里面如果你想要发送消息,那么就可能是上面这样设置,那么发送时候输出的格式是什么呢?

如下:

<message id='923442621149' type='chat'>
<body>shanraisshan</body>
</message>

不过,或者,如果要做一个已读回执的功能,需要用到下面的自定义格式:

<message id='923442621149' type='chat'>
<body>1</body>
<received xmlns='urn:xmpp:receipts' id='chat-WN-CSemD6q9-androidHD-e1z3uuUv'/>
</message>

那么怎么办?

留意看看上面的这一段:

<received xmlns='urn:xmpp:receipts' id='chat-WN-CSemD6q9-androidHD-e1z3uuUv'/>

其实这就是自定义扩展元素了。
其中
元素名称为received
命名空间xmlns为:urn:xmpp:receipts,
额外还多一个id元素,这个元素用来标识,到底是哪一条消息的id,给客户端判断。

下面说说具体实现。

具体代码实现

package net.w2p.LibClientExt.xmpp.stanzas;

import org.jivesoftware.smack.packet.DefaultExtensionElement;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.provider.EmbeddedExtensionProvider;
import org.jivesoftware.smack.util.XmlStringBuilder;
import java.util.List;
import java.util.Map;

/**
 * https://stackoverflow.com/questions/32940874/custom-extension-element-in-stanza-for-smack-4-1-4/39364219#39364219
 */
public class ReplyExtension implements ExtensionElement  {

    public static final String NAMESPACE = "urn:xmpp:receipts";
    public static final String ELEMENT = "received";

    String attr_id = null;

    static final String ATTRIBUTE_REPLY_TEXT = "id";

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

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

    @Override
    public CharSequence toXML(String enclosingNamespace) {
        XmlStringBuilder xml = new XmlStringBuilder(this);
        xml.attribute(ATTRIBUTE_REPLY_TEXT, getAttrId());
        xml.closeEmptyElement();
        return xml;
    }

//    @Override
//    public XmlStringBuilder toXML() {
//        XmlStringBuilder xml = new XmlStringBuilder(this);
//        xml.attribute(ATTRIBUTE_REPLY_TEXT, getAttrId());
//        xml.closeEmptyElement();
//        return xml;
//    }

//__________________________________________________________________________________________________
    public void setAttrId(String _rText) {
        attr_id = _rText;
    }

    public String getAttrId() {
        return attr_id;
    }

//__________________________________________________________________________________________________
    public static class Provider extends   EmbeddedExtensionProvider<ReplyExtension> {
        @Override
        protected ReplyExtension createReturnExtension(String    currentElement, String currentNamespace, Map<String, String> attributeMap,    List<? extends ExtensionElement> content) {
            ReplyExtension repExt = new ReplyExtension();
            repExt.setAttrId(attributeMap.get(ATTRIBUTE_REPLY_TEXT));
            return repExt;
        }
    }
}

注册一下处理方案:


    static{
        //--注册一下扩展元素。
        ProviderManager.addExtensionProvider(ReplyExtension.ELEMENT,
                ReplyExtension.NAMESPACE, new ReplyExtension.Provider());

    }

然后这样发送:

  /****
     * 发送消息回执
     * ***/
    public void sendReceiptReply(Jid from,Jid to,String msgId){
        if(from==null||to==null){
            return;
        }
        if(ValidateUtils.isEmpty(msgId)){
            return;
        }

        Message message = new Message();
        message.setFrom(from);
        message.setTo(to);
        message.setStanzaId(WebTools.randomUUID());//--随机id
        message.setType(Message.Type.chat);
        message.setBody("1");
//adding custom reply extension
        ReplyExtension repExt = new ReplyExtension();
        repExt.setAttrId(msgId);
        message.addExtension(repExt);
//        Log.e("message --->", message.toXML().toString());        
        try {
            //--放入队列等待发送。
            queue.offer(message);
            //如果你不用队列,那么请直接使用:
//            if(this.conn!=null){
//                this.conn.sendStanza(message);
//            }
        } catch (Exception e) {
            e.printStackTrace();
            
        }
    }

接收消息是这样处理的:

  /***
             * 消息回执检测
             *
             * ***/
            /****
             * <message xmlns='jabber:client' to='1000@developing.com/androidHD'
             * from='1000@developing.com' type='normal'>
             * <received xmlns='urn:xmpp:receipts' id='chat-WN-CSejHDpQ-androidHD-Nn72XLH6'/>
             * </message>
             * ****/
            final ExtensionElement tmpPacketExt =  packet.
                    getExtension(ReplyExtension.NAMESPACE);
            ReplyExtension repExt = (ReplyExtension)tmpPacketExt;
            if(repExt!=null) {
                final Jid _from = packet.getFrom();
                final Jid _to = packet.getTo();

                logger.info("需要执行已读回执。");
                logger.info(repExt.toXML("")+"");
                sendReceiptReply(_to,_from,repExt.getAttrId());
                return;
            }
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值