1.客户端发送自定义IQ消息
(1)自定义消息扩展
public class MyIQExtension implements ExtensionElement{
private String first;
private String second;
private String timestamp;
private String content;
public MyIQExtension (String first, String second, String timestamp, String content) {
this.first = first;
this.second = second;
this.timestamp = timestamp;
this.content = content;
}
@Override
public String getElementName() {
return "myiq";
}
@Override
public CharSequence toXML() {
StringBuilder builder = new StringBuilder();
builder.append(" first=\"").append(first).append("\" ");
builder.append("second=\"").append(second).append("\" ");
builder.append("timestamp=\"").append(timestamp).append("\" ");
builder.append(">");
builder.append("
builder.append(content);
builder.append("
return builder.toString();
}
@Override
public String getNamespace() {
return "my:myiq";
}
}
(2)自定义IQ
public class MyIQ extends IQ{
private String first;
private String second;
private String timestamp;
private String content;
public MyIQ (String childElementName, String childElementNamespace, String first, String second, String timestamp, String conent) {
super(childElementName, childElementNamespace);
this.first = first;
this.second = second;
this.timestamp = timestamp;
this.content = conent;
}
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
List
elements.add(new MyIQExtension(this.first, this.second, this.timestamp, this.content));
xml.append(elements);
return xml;
}
}
(3)发送自定义MyIQ
connection.sendStanza(new MyIQ(....))
2. 好友接收MyIQ自定义解析
(1)自定义IQProvider
public class MyIQProvider extends IQProvider{
private String first;
private String second;
private String timestamp;
private String content;
@Override
public Element parse(XmlPullParser parser, int initialDepth)
throws XmlPullParserException, IOException, SmackException {
System.out.println("parser---------------start----" + initialDepth);
int event = parser.getEventType();
String currentTAG = null ;
while (true) {
switch (event) {
case XmlPullParser.TEXT:
if(currentTAG != null && currentTAG.equals("content")) {
this.content = parser.getText();
}
break;
case XmlPullParser.START_TAG:
currentTAG = parser.getName();
if(parser.getName().equals("fmiq")){
for(int i = 0; i < parser.getAttributeCount(); i++) {
if(parser.getAttributeName(i).equals("first")) {
this.first = parser.getAttributeValue(i);
}
else if(parser.getAttributeName(i).equals("second")) {
this.second = parser.getAttributeValue(i);
}
else if(parser.getAttributeName(i).equals("second")) {
this.second = parser.getAttributeValue(i);
}
else if(parser.getAttributeName(i).equals("timestamp")) {
this.timestamp = parser.getAttributeValue(i);
}
}
}
break;
case XmlPullParser.END_TAG:
break;
default:
break;
}
if (event == XmlPullParser.END_TAG && "myiq".equals(parser.getName())) break;
event = parser.next();
}
return new FmIQ("myiq", "my:myiq", this.first, this.second, this.timestamp, this.content);
}
}
(2)注册IQProvider
ProviderManager.addIQProvider("myiq", "my:myiq", new MyIQProvider());
3.好友自定义处理MyIQ指令
(1)自定义IQRequestHandler(get类型)
public class MyGetIQRequestHandler implements IQRequestHandler{
private Logger log = Red5LoggerFactory.getLogger(this.getClass());
@Override
public IQ handleIQRequest(IQ iqRequest) {
System.out.println("handleIQRequest----" + iqRequest);
Document document = null;
try {
document = DocumentHelper.parseText(iqRequest.toXML().toString());
Element fmiqElement = document.getRootElement().element("fmiq");
if(fmiqElement == null) return null;
String first = fmiqElement.attributeValue("first");
String second = fmiqElement.attributeValue("second");
String timestamp = fmiqElement.attributeValue("timestamp");
Element conentElement = fmiqElement.element("content");
String content = conentElement.getText();
String identify = content;
System.out.println("first-->" + first);
System.out.println("second-->" + second);
System.out.println("timestamp-->" + timestamp);
System.out.println("content-->" + content);
//返回处理结果,这里需要构造自定义的MyIQ,
//如果使用IQ repleyIQ = IQ.createResultIQ(iqRequest);自定义的IQ消息会被过滤掉
FmIQ repleyIQ = new FmIQ("fmiq", "fm:fmcmd", first, second, timestamp, "测试");
repleyIQ.setStanzaId(iqRequest.getStanzaId());
repleyIQ.setType(Type.result);
repleyIQ.setFrom(iqRequest.getTo());
repleyIQ.setTo(iqRequest.getFrom());
// IQ repleyIQ = IQ.createResultIQ(iqRequest);
// repleyIQ.addExtension(new FmIQExtension(first, second, timestamp, count + ""));
System.out.println("----------------" + repleyIQ.toString());
System.out.println("----------------" + repleyIQ.toXML());
return repleyIQ;
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
@Override
public Mode getMode() {
return Mode.sync;
}
@Override
public Type getType() {
return Type.get;
}
@Override
public String getElement() {
return "myiq";
}
@Override
public String getNamespace() {
return "my:myiq";
}
}
(2)自定义IQRequestHandler(set类型)
public class MySetIQRequestHandler extends MyGetIQRequestHandler{
@Override
public Type getType() {
return Type.set;
}
}
(3)注册iq处理handler
connection.registerIQRequestHandler(new MyGetIQRequestHandler());
connection.registerIQRequestHandler(new MySetIQRequestHandler());