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;
}
特意写个博客出来帮助和我一样在摸索的小伙伴。
尊重原创,转载请注明出处,谢谢。