Xmpp发送自定义IQ包

 

Xmpp发送自定义的iq

 

因为需要做扩展业务,学习了插件开发,但是客户端的怎么构造packet发消息到服务器插件一直没有搞明白,于是各种百度未果后,准备自己摸索,最开始用的和服务器一样的dom4j构造了一个xml节点,如下:

/**
 * 构建iq的扩展包,用于发送用户所在房间的名称。
 */
Document document = DocumentHelper.createDocument();
Element iqe = document.addElement("iq");
iqe.addAttribute("type", "result");
iqe.addAttribute("to", userJid.toFullJID());
iqe.addAttribute("id", IDUtil.getID());
 
Namespace namespace = new Namespace("", "larson");
Element response = iqe.addElement("wechat");
response.add(namespace);
 
// 最后发送出去!
IQ iq = new IQ(iqe);
System.out.println("iq " + iq.toXML());
router.route(iq);

 

但是发现asmackiq并没有new IQ这个方法,我怎么页new不出,在各种百度提问未果时,我想到了spark的源码,果然在spark的插件包下找到了,哦,原来是自定义的iq包是集成IQ复写里面的方法,然后发送自定义的这个对象来实现的,如下:

 

import org.jivesoftware.smack.packet.IQ;

public class WeChatPacket extends IQ {

	public static final String ELEMENT_NAME = "wechat";
	public static final String NAMESPACE = "wechat";

	private String urlStr;
	private String json;

	public String getUrlStr() {
		return urlStr;
	}

	public void setUrlStr(String urlStr) {
		this.urlStr = urlStr;
	}

	public String getJson() {
		return json;
	}

	public void setJson(String json) {
		this.json = json;
	}

	@Override
	public String getChildElementXML() {
		StringBuffer buf = new StringBuffer();
		buf.append("<" + ELEMENT_NAME + " xmlns=\"" + NAMESPACE + "\">");
		if (getType() == IQ.Type.GET) {
			buf.append("<urlStr>").append(urlStr).append("</urlStr>");
			buf.append("<json>").append(json).append("</json>");
			buf.append(getExtensionsXML());
		}
		buf.append("</" + ELEMENT_NAME + ">");
		return buf.toString();
	}

}

 发送的时候直接发送就好了:

 

private static Packet makeXmppPacket(String urlStr, String json) {
		
		WeChatPacket packet = new WeChatPacket();
		packet.setJson(json);
		packet.setUrlStr(urlStr);
		packet.setType(IQ.Type.SET); 
		return packet;
	}

 

特意写个博客出来帮助和我一样在摸索的小伙伴。

 

尊重原创,转载请注明出处,谢谢。

展开阅读全文

没有更多推荐了,返回首页