Smack 例子代码- -| 回首页 | 2006年索引 | - -兴业银行e卡的实物卡两个月都没寄来!发邮件给客服邮箱,居然说邮箱已满了,信被退回!

xmpp中的offline subscribe presence接收(离线添加好友邀请的接收问题)

关键词xmpp    offline    presence                                          

场景如下,jabber服务器为wildfire 3.0.1。A加B为好友,但B此时不在线。当B上线时,他应该马上收到<presence from="A@baisong" type="subscribe"/>,即A加B的请求。但实际上,B要发送一个<presence><c node="http://exodus.jabberstudio.org/caps" ver="0.9.1.0" xmlns="http://jabber.org/protocol/caps"/><status>Available</status><priority>1</priority></presence>,才能收到这个请求。

在网上搜索了一把,发现理论上如果B一上线,就应当收到A发来的邀请或是离线的message,但当服务器为wildfire 3.0.1的情况下,只有离线message是服务器主动发送给刚上线的B,而presence不发。服务器这样做,好像是为了实现《XEP-0013: Flexible Offline Message Retrieval》这个规范。

所以如果B想取得他在离线时别人发送的添加好友的邀请时,需要发送一个requeset。即<presence><c node="http://exodus.jabberstudio.org/caps" ver="0.9.1.0" xmlns="http://jabber.org/protocol/caps"/><status>Available</status><priority>1</priority></presence>。

我在smack中组装这个请求的代码为:
public static Presence getOfflineRequest()
{
 Presence presence = new Presence(Presence.Type.AVAILABLE,null,0,Presence.Mode.AVAILABLE)
 {
   public String getExtensionsXML() {
    return "<c node=\"http://exodus.jabberstudio.org/caps\" ver=\"0.9.1.0\" xmlns=\"http://jabber.org/protocol/caps\"/>";
   }
 };
 return presence;
}

另外需要注意的是:

1、登录时不要发送avaliable的presece,否则也会接收不到offline presence。比如在smack中登录就这样:
connection.login(id, password, RESOURCE, false);


2、收到的Presence形如<presence from="A@baisong" type="subscribe"/>,没有to,所以也注意不要用你的Filter给过滤掉。我在smack中用了一个OrFilter来解决。
new OrFilter(new PacketTypeFilter(Presence.class),new ToContainsFilter(id))

【作者: 柏松】【访问统计:】【2006年11月1日 星期三 11:10】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=5816592

回复

- 评论人:爱是永不止息   2006-11-03 13:41:38   

啊,我可是研究过规范的,的

验证码:   
评论内容: