smack/asmack 监听特定报文代码

首先需要两个类

import org.jivesoftware.smack.packet.PacketExtension;


public class XtalkMessage implements PacketExtension {

	private StringBuffer packetContent = null;
	
	public static final String ELEMENT_NAME="xtalk";
	public static final String NAME_SPACE="urn:xmpp:xtalk:dd";
	
	public StringBuffer getPacketContent() {
		return packetContent;
	}
	
	public void setPacketContent(StringBuffer packetContent) {
		this.packetContent = packetContent;
	}
	
	
	@Override
	public String getElementName() {
		// TODO Auto-generated method stub
		return ELEMENT_NAME;
	}

	@Override
	public String getNamespace() {
		// TODO Auto-generated method stub
		return NAME_SPACE;
	}

	@Override
	public String toXML() {
		// TODO Auto-generated method stub
		return packetContent.toString();
	}

}
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.provider.PacketExtensionProvider;
import org.jivesoftware.smack.util.StringUtils;
import org.xmlpull.v1.XmlPullParser;

public class XtalkMessageProvider implements PacketExtensionProvider {

	public XtalkMessageProvider() {
	}

	public PacketExtension parseExtension(XmlPullParser parser)
			throws Exception {
		XtalkMessage messageEvent = new XtalkMessage();
		StringBuffer buffer = new StringBuffer();
		boolean done = false;
		int oldNsCount = 0;
		oldNsCount = parser.getNamespaceCount(parser.getDepth());
		while (!done) {
			int eventType = parser.next();
			if (eventType == XmlPullParser.START_TAG) {
				buffer.append('<' + parser.getName());
				int ns = parser.getNamespaceCount(parser.getDepth());
				for (int i = oldNsCount; i < ns; i++) {
					if (parser.getNamespacePrefix(i) != null) {
						buffer.append("  xmlns:")
								.append(parser.getNamespacePrefix(i))
								.append("=\"")
								.append(parser.getNamespaceUri(i)).append("\"");
					} else {
						buffer.append("  xmlns=\"")
								.append(parser.getNamespaceUri(i)).append("\"");
					}
				}
				oldNsCount = ns;
				for (int i = 0; i < parser.getAttributeCount(); i++) {
					buffer.append(" ").append(parser.getAttributeName(i))
							.append("=");
					buffer.append("\"").append(parser.getAttributeValue(i))
							.append("\"");
				}
				buffer.append('>');
			} else if (eventType == XmlPullParser.TEXT) {
				// System.out.println("XmlPullParser.TEXT:"
				// + StringUtils.escapeForXML(parser.getText()));
				//buffer.append(StringUtils.escapeForXML(parser.getText()));                               buffer.append(parser.getText());
			} else if (eventType == XmlPullParser.END_TAG) {
				if (parser.getName().equals(XtalkMessage.ELEMENT_NAME)) {
					done = true;
				} else {
					buffer.append("</" + parser.getName() + '>');
				}
			}
		}
		// System.out.println(TAG + " PacketExtension:" + buffer.toString());
		messageEvent.setPacketContent(buffer);
		return messageEvent;
	}
}

在主程序中调用如下

ProviderManager.getInstance().addExtensionProvider(
				XtalkMessage.ELEMENT_NAME, XtalkMessage.NAME_SPACE,
				new XtalkMessageProvider());

猜你喜欢

转载自linyu19872008.iteye.com/blog/1845543