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

Posted

技术标签:

【中文标题】如何使用 smack(java) 创建、发送和接收 iq 数据包【英文标题】:How Can I create,send and receive iq packets using smack(java) 【发布时间】:2010-01-28 04:49:07 【问题描述】:

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

这是我的代码的 sn-p

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");

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

如果您有自定义查询并且想要使用您的 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 为您填写“发件人”。

【讨论】:

我怎样才能得到这个原始查询的响应?我无法从中得到任何回应【参考方案3】:
//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

【讨论】:

我如何发送这个 推送模式下的短信falseapplepushDeviceTokenapplication1

以上是关于如何使用 smack(java) 创建、发送和接收 iq 数据包的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Smack API 使用 openfire 服务器发送/接收消息

无法在 JAVA 中使用 SMACK api 显示收到的消息

使用 Smack Api for Android 发送和接收消息

使用 Smack 和 Openfire 发送/接收消息时遇到问题

使用 smack API 发送和接收消息

SmackInitialization:无法确定 Smack 版本