项目中有这么一个需求: html
1. 间隔一分钟,查询XMPP服务器,获取在某个聊天室中的成员信息 git
2. 获取查询结果,作相应处理 github
查询XMPP协议,发现XEP-0045文档有作相关的协议说明:http://xmpp.org/extensions/xep-0045.html#disco-roomitems ,用到的是多用户聊天室(MUC)的discovery操做,对应的Namespace Uri为: c#
http://jabber.org/protocol/disco#items
查询消息定义: 服务器
<iq from='you jid' id='message id' to='roomJid' type='get'> <query xmlns='http://jabber.org/protocol/disco#items'/> </iq>正常的查询结果消息格式定义:
<iq from='roomJid' id='message id' to='you jid' type='result'> <query xmlns='http://jabber.org/protocol/disco#items'> <item jid='roomJid/member1NickName'/> <item jid='roomJid/member2NickName'/> </query> </iq>若是该房间是私有房间,按照XEP-0030文档协议,可能返回的消息是一个空查询:
<iq from='roomJid' id='message id' to='you jid' type='result'> <query xmlns='http://jabber.org/protocol/disco#items' /> </iq>
通用的作法是拼接XML,而后发送,而后处理Iq到达消息。不一样的库封装方法可能不同,可是底层发送出去时,必然都是同样的XML文本。 dom
我用的XMPP库是agsXMPP,具体的实现代码以下: 学习
查询: spa
Jid roomJid = new Jid("roomName","domain.com"); /// <summary> /// 查询聊天室内成员 /// </summary> private void QueryMembers() { DiscoItemsIq discoItemIq = new DiscoItemsIq(IqType.get) discoItemIq.To = roomJid; xmppConnection.IqGrabber.SendIq(discoItemIq , new IqCB(QueryIqHandler), null); //更简单的操做:DiscoManager discoM = new DiscoManager(xmppConnection); //discoM.DiscoverItems(roomJid, new IqCB(QueryIqHandler), null ); } /// <summary> /// 处理查询结果 /// </summary> /// <param name="sender"></param> /// <param name="iq"></param> /// <param name="data"></param> private void QueryIqHandler(object sender ,IQ iq, object data) { if(iq.Type == IqType.result) { DiscoItems items = iq.SelectSingleElement<DiscoItems>(); foreach(DiscoItem item in items.GetDiscoItems()) { //roomJid = item.Jid.Bare; //memberNick = item.Jid.Resource; //other process... } } }
记录XMPP学习过程.... code