?
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);
?
但是发现asmack的iq并没有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; }
?
特意写个博客出来帮助和我一样在摸索的小伙伴。
?
尊重原创,转载请注明出处,谢谢。
原文:http://zhonglunshun.iteye.com/blog/2172600