smack 4.2客户端自定义iq,解析,自定义处理handler

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 = new ArrayList<>();
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());

你可能感兴趣的:(smack,xmpp,自定义IQ)