zoukankan      html  css  js  c++  java
  • 扩展Smack Message

    XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。

    Smack是一个开源的用 java 写的XMPP(jabber)客户端代码库

    因为XMPP是XML,所以进行扩展十分方便。而Smack也提供了对Message扩展的支持。

    Smack对Message扩展主要需要两个接口

    org.jivesoftware.smack.packet.PacketExtension
    org.jivesoftware.smack.provider.PacketExtensionProvider

    假设我们需要扩展一个消息回执,需要在Message中定义一个Received节点:

    package org.jivesoftware.smack.packet;
    
    import org.jivesoftware.smack.packet.PacketExtension;
    import org.jivesoftware.smack.util.StringUtils;
    
    public class Received implements PacketExtension {
    
    	public static final String NAME = "received";
    	public static final String NAME_SPACE = "urn:xmpp:receipts";
    
    	private String id = "";
    	private Integer status = 0;
    
    	/**
    	 * @return the id
    	 */
    	public String getId() {
    		return id;
    	}
    
    	/**
    	 * @param id the id to set
    	 */
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	/**
    	 * @return the status
    	 */
    	public Integer getStatus() {
    		return status;
    	}
    
    	/**
    	 * @param status the status to set
    	 */
    	public void setStatus(Integer status) {
    		this.status = status;
    	}
    
    	@Override
    	public String getElementName() {
    		return "received";
    	}
    
    	@Override
    	public String getNamespace() {
    		return "urn:xmpp:receipts";
    	}
    
    	@Override
    	public String toXML() {
    		StringBuilder buffer = new StringBuilder();
    		buffer.append("<received xmlns="urn:xmpp:receipts"");
    		buffer.append(" id="").append(StringUtils.escapeForXML(id)).append(""");
    		buffer.append(" status="").append(status).append(""");
    		buffer.append("/>");
    		return buffer.toString();
    	}
    }
    

      

     然后我们需要定义一个Received的解析器

    package org.jivesoftware.smack.provider;
    
    import org.jivesoftware.smack.packet.PacketExtension;
    import org.jivesoftware.smack.packet.Received;
    import org.xmlpull.v1.XmlPullParser;
    
    public class ReceivedProvider implements PacketExtensionProvider {
    
    	@Override
    	public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
    		boolean done = false;
    		Received received = new Received();
    		while (!done) {
    			int eventType = parser.next();
    			String name = parser.getName();//XML Tab标签
    			if (eventType == XmlPullParser.START_TAG) {
    				if (name.equals("id")) {
    					received.setId(parser.nextText());
    				}
    				if (name.equals("status")) {
    					received.setStatus(Integer.parseInt(parser.nextText().trim()));
    				}
    			}
    			if (eventType == XmlPullParser.END_TAG) {
    				if (Received.NAME.equals(name)) {
    					done = true;
    				}
    			}
    		}
    		return received;
    	}
    
    }
    

     

    我们在使用Smack的时候需要将扩展的Provider添加到ProviderManager

    ProviderManager.getInstance().addExtensionProvider(Received.NAME, Received.NAME_SPACE, new ReceivedProvider());

     

    我们想message添加received

    Message message = new Message();
    message.setTo("to");//目标
    message.setFrom("from");//来源
    Received received = new Received();
    received.setId("CJq74-0");//回执的消息ID
    received.setStatus(1);//回执状态
    message.addExtension(received);
    System.out.println(message.toXML());//查看XML

      

    XML的格式

    <message id="CJq74-1" to="to" from="from"><received xmlns="urn:xmpp:receipts" id="CJq74-0" status="1"/></message>
    

     

    我们可以这样获得received

    Received received=(Received)message.getExtension(Received.NAME, Received.NAME_SPACE);
    

      

  • 相关阅读:
    解决Oracle 11g 或 ODAC 11.2 多客户端版本的乱码问题
    C#.ToString()格式大全
    太阳的眼泪
    oracle database link 12154 tns 无法识别错误的解决方案
    List<T>泛型的Find 和 Where 用法范例
    chrome 下载工具支持
    解决,启动office2007时总出现“正在配置Microsoft Office Professional Plus 2007”的字样
    macOS M1 下pip install安装.whl报错“is not a supported wheel on this platform.
    Mail.Ru Cup 2018 Round 3 B. Divide Candies (数论)
    202120221 BUCT ACM集训队每周程序设计竞赛(8) 问题D :一月忘干净
  • 原文地址:https://www.cnblogs.com/relucent/p/4341295.html
Copyright © 2011-2022 走看看