繁体   English   中英

如何使用smack(java)创建,发送和接收iq数据包

[英]How Can I create,send and receive iq packets using smack(java)

我连接到服务器(Xmpp)但无法在我的psi客户端发送和接收数据包

这是我的代码片段

POSClientIQ posclientiq = new POSClientIQ();
    posclientiq.connectXMPPServer();
    posclientiq.processMessage();
   }

   public void processMessage()
   {  try{

      final  IQ iq1 = new IQ() {
     public String getChildElementXML() {
      return "<iq type='get' from ='sam'><query xmlns='jabber:iq:roster'></query></iq>";
    }
  };

  iq1.setType(IQ.Type.GET);
 // PacketCollector collector = connection.createPacketCollector(new PacketIDFilter(iq1.getPacketID()));
  connection.sendPacket(iq1);

  System.out.println("Message send");

getChildElementXML()返回标记。 如果您使用Smack,那么除非是自定义查询,否则您不需要编写自己的IQ实现。 对于您的情况,查询名册使用RosterPacket

如果您有自定义查询,并且希望使用IQ实现,那么:

final IQ iq = new IQ() {
public String getChildElementXML() { 
return "<query xmlns='http://jabber.org/protocol/disco#info'/>"; // here is your query
//this returns "<iq type='get' from='User@YourServer/Resource' id='info1'> <query xmlns='http://jabber.org/protocol/disco#info'/></iq>";
 }};
// set the type
iq.setType(IQ.Type.GET);
// send the request
connection.sendPacket(iq); 

正如您所看到的,您有自定义查询,并使用Smack设置其余的IQ,例如设置类型。 请注意,Smack根据您登录的JID为您填写“来自”。

//To retrieve archive msges from server..

MyCustomIQ iq = new MyCustomIQ();
      iq.setType(IQ.Type.set);
     mConnection.sendIqWithResponseCallback(iq, new PacketListener() {
                @Override
                public void processPacket(Packet packet) throws SmackException.NotConnectedException {
                    Log.i("Send IQ with Response", "****** message " + packet);
                }
            }, new ExceptionCallback() {
                @Override
                public void processException(Exception exception) {
                  exception.printStackTrace();
                    Log.i("IO archjieve Exception",""+ exception.getMessage());
                }
            }, 5000);

      mConnection.sendPacket(new Presence(Presence.Type.available));
            PacketTypeFilter filter=new PacketTypeFilter(org.jivesoftware.smack.packet.Message.class);
            PacketListener myListener=new PacketListener(){
                public void processPacket(Packet packet){
                   if(((Message) packet).getType().equals(Message.Type.chat))
                    {
                        ((Message) packet).getBody();
                    }
                    else if(((Message) packet).getType().equals(Message.Type.normal))
                    {
                        DefaultPacketExtension pacExten=PacketUtil.packetExtensionfromCollection(packet.getExtensions(), "result", "urn:xmpp:mam:0");
                        String strMsg=pacExten.getValue("body");
                    }
                }
            }
             ;
           mConnection.addPacketListener(myListener, filter);


    //My Custom IQ
    class MyCustomIQ extends IQ {

            String token;


            protected MyCustomIQ() {
            super("query","urn:xmpp:mam:0");
            }



            @Override
            protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
    //  String queryId = prefix + Long.toString(new AtomicLong().incrementAndGet());
                xml.attribute("queryid",queryId);
                xml.rightAngleBracket();
                return xml;
            }


        }


//You may get the response in PacketListerener sometimes so put debug in that also

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM