agsXMPP客户端关于好友在线状态的设置及其响应的方法
2012-12-17 13:58
344 查看
agsXMPP越来越多人用,最近有几个网友都问起如何在agsXMPP的客户端处理好友在线状态的设置以及响应。
agsXMPP里面有2个重要的地方可以设置在线状态:
1.PresenceType.available和PresenceType.unavailable,XMPP官方不推荐使用PresenceType.unavailable来实现隐身,为什么?A用户给B用户(或者所有用户)发送PresenceType.unavailable,那就相当于下线了,根本不能识别是“隐身”还是“下线”,有些偏门的工具喜欢把隐身的用户给显示出来。。。。。。。所以,那就不建议用PresenceType.unavailable咯。
2.ShowType.XXXXX,这个就不用多说了,其本身就是设置多种在线状态的。。。。
下面的代码实现了如何告诉特定好友(用循环就可以多个好友了),自己的在线状态:
view
plaincopy
to clipboardprint?
/// <summary>
/// 告诉服务器/好友,我的当前可视状态
/// </summary>
/// <param name="jidTo">null表示通知服务器,非null则是指定好友</param>
/// <param name="visible">0:可视,1:invisible,2:unavailable</param>
public static void ChangMyState(String jidTo, int visible)
{
Presence p = new Presence();
if (jidTo != null)
p.To = new Jid(jidTo);
if (visible == 0)//上线,完全可视
{
p.Type = PresenceType.available;
p.Show = ShowType.chat;
}
else if (visible == 1)//上线,不可见
{
p.Type = PresenceType.available;
p.Show = ShowType.away;
}
else if (visible == 2)//下线,不可见
{
p.Type = PresenceType.unavailable;
}
Cls_Config.XmppCon.Send(p);
}
下面的代码就实现了如何响应好友发送过来的在线状态:
view
plaincopy
to clipboardprint?
delegate void OnPresenceDelegate(object sender, Presence pres);
/// <summary>
/// 收到Presence节时引发的事件,判断用户上线/离线触发,以及用户处理好友请求(拒绝/接受)、被T处理
/// </summary>
private void XmppCon_OnPresence(object sender, Presence pres)
{
if (ucContactList.InvokeRequired)
{
ucContactList.BeginInvoke(new OnPresenceDelegate(XmppCon_OnPresence), new object[] { sender, pres });
return;
}
//****************处理好友请求************************//
if (pres.Type == PresenceType.subscribe)//收到好友请求
{
//提问用户是否接受好友请求
}
else if (pres.Type == PresenceType.subscribed) { }
else if (pres.Type == PresenceType.unsubscribe) {}
else if (pres.Type == PresenceType.unsubscribed)//收到“拒绝请求”或者“被T”的时候
{
}
else //处理好友上线/离线的事件处理
{
if (pres.From.Bare.Equals(Cls_Config.XmppCon.MyJID.Bare) == false)//如果不是自己的信息,即好友信息
{
//检测该好友是否不存在于好友列表(OnPresence比OnRosterItem优先处理添加好友),则自动添加ListItem
if (Cls_Config.alFriendsList.IndexOf(pres.From.Bare) == -1)
{
//添加到好友列表
}
//判断该好友目前的状态,上线还是离线
if (pres.Type == PresenceType.available && pres.Show==ShowType.chat)//如果好友上线,并且是chat状态
{}
else if(pres.Type == PresenceType.available && pres.Show==ShowType.away)//如果好友上线,并且是away状态
{}
else if (pres.Type == PresenceType.unavailable)//如果好友离线
{}
}
}
}
这两句是判断的关键:
if
(pres.Type == PresenceType.available && pres.Show==ShowType.chat)//如果好友上线,并且是chat状态
{}
else
if(pres.Type == PresenceType.available && pres.Show==ShowType.away)//如果好友上线,并且是away状态
{}
agsXMPP里面有2个重要的地方可以设置在线状态:
1.PresenceType.available和PresenceType.unavailable,XMPP官方不推荐使用PresenceType.unavailable来实现隐身,为什么?A用户给B用户(或者所有用户)发送PresenceType.unavailable,那就相当于下线了,根本不能识别是“隐身”还是“下线”,有些偏门的工具喜欢把隐身的用户给显示出来。。。。。。。所以,那就不建议用PresenceType.unavailable咯。
2.ShowType.XXXXX,这个就不用多说了,其本身就是设置多种在线状态的。。。。
下面的代码实现了如何告诉特定好友(用循环就可以多个好友了),自己的在线状态:
view
plaincopy
to clipboardprint?
/// <summary>
/// 告诉服务器/好友,我的当前可视状态
/// </summary>
/// <param name="jidTo">null表示通知服务器,非null则是指定好友</param>
/// <param name="visible">0:可视,1:invisible,2:unavailable</param>
public static void ChangMyState(String jidTo, int visible)
{
Presence p = new Presence();
if (jidTo != null)
p.To = new Jid(jidTo);
if (visible == 0)//上线,完全可视
{
p.Type = PresenceType.available;
p.Show = ShowType.chat;
}
else if (visible == 1)//上线,不可见
{
p.Type = PresenceType.available;
p.Show = ShowType.away;
}
else if (visible == 2)//下线,不可见
{
p.Type = PresenceType.unavailable;
}
Cls_Config.XmppCon.Send(p);
}
下面的代码就实现了如何响应好友发送过来的在线状态:
view
plaincopy
to clipboardprint?
delegate void OnPresenceDelegate(object sender, Presence pres);
/// <summary>
/// 收到Presence节时引发的事件,判断用户上线/离线触发,以及用户处理好友请求(拒绝/接受)、被T处理
/// </summary>
private void XmppCon_OnPresence(object sender, Presence pres)
{
if (ucContactList.InvokeRequired)
{
ucContactList.BeginInvoke(new OnPresenceDelegate(XmppCon_OnPresence), new object[] { sender, pres });
return;
}
//****************处理好友请求************************//
if (pres.Type == PresenceType.subscribe)//收到好友请求
{
//提问用户是否接受好友请求
}
else if (pres.Type == PresenceType.subscribed) { }
else if (pres.Type == PresenceType.unsubscribe) {}
else if (pres.Type == PresenceType.unsubscribed)//收到“拒绝请求”或者“被T”的时候
{
}
else //处理好友上线/离线的事件处理
{
if (pres.From.Bare.Equals(Cls_Config.XmppCon.MyJID.Bare) == false)//如果不是自己的信息,即好友信息
{
//检测该好友是否不存在于好友列表(OnPresence比OnRosterItem优先处理添加好友),则自动添加ListItem
if (Cls_Config.alFriendsList.IndexOf(pres.From.Bare) == -1)
{
//添加到好友列表
}
//判断该好友目前的状态,上线还是离线
if (pres.Type == PresenceType.available && pres.Show==ShowType.chat)//如果好友上线,并且是chat状态
{}
else if(pres.Type == PresenceType.available && pres.Show==ShowType.away)//如果好友上线,并且是away状态
{}
else if (pres.Type == PresenceType.unavailable)//如果好友离线
{}
}
}
}
这两句是判断的关键:
if
(pres.Type == PresenceType.available && pres.Show==ShowType.chat)//如果好友上线,并且是chat状态
{}
else
if(pres.Type == PresenceType.available && pres.Show==ShowType.away)//如果好友上线,并且是away状态
{}
相关文章推荐
- agsXMPP客户端关于好友在线状态的设置及其响应的方法
- agsXMPP客户端关于好友在线状态的设置及其响应的方法
- agsXMPP客户端关于好友在线状态的设置及其响应的方法
- 网页中嵌套QQ代码设置在线状态无需加好友聊天
- XMPP客户端关于用户组和好友列表的管理的一个实现方法
- 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但应为“text/xml”的解决方法
- XMPP客户端关于用户组和好友列表的管理的一个实现方法
- WCF关于客户端在线状态的处理
- 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但应为“text/xml”的解决方法
- WCF关于客户端在线状态的处理
- 关于腾讯通(RTX)服务器端和客户端的安装设置及其报错
- 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但应为“text/xml”的解决方法
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
- 网页中嵌套QQ代码设置在线状态无需加好友聊天
- JavaEE关于session的生命周期的几种设置方法
- Android ListView的item背景色设置和item点击无响应的解决方法
- 数据List刷新UI的Items显示(比如服务器给客户端刷新好友列表) 方法(1)
- 关于闹钟设置AlarmManager类方法参数解释
- 金蝶KIS10专业版客户端打开'91'错误:未设置对象变量或 With block 变量的解决方法
- 关于设置UIView的背景为图片的方法以及问题