如何使用 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
【讨论】:
我如何发送这个以上是关于如何使用 smack(java) 创建、发送和接收 iq 数据包的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 Smack API 使用 openfire 服务器发送/接收消息
无法在 JAVA 中使用 SMACK api 显示收到的消息
使用 Smack Api for Android 发送和接收消息