簡體   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