创建基于agsXMPP的实例分类:C#jabber/XMPP2010-12-1020:3747人阅读评论(0)收藏举报agsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。通过下面的三项技术,agsXMPP达到了这个目标。1.异步套接字2.与工厂模式结合的快速XML解析器3.自有的轻量级XMLDom,作为所有agsXMPP协议类的基础我们为什么不直接所用Microsoft的System.Xml命名空间里的类呢?因为我们决定创建自己的轻量级的XmlDom,能够飞快地运作,特别是在像PPC's和Smartphones这样的嵌入式设备上。XmlTextReader有利于SAX-like的解析。但是Microsoft在.NET1.1的SP1中做了下改变,这使得我们不能够再使用它来解析网络流。所以我们需要另外的XML解析器。类库的惊人之处在哪?一旦从套接字接收到数据,该数据便由sax-likeXML解析器解析。此解析器使用工厂模式来创建agsXMPP协议类相关的元素。示例:套接字接收到一条信息,将比特流推送至解析器。XML解析器探测到隶属于jabber:client命名空间中名字为message的开标签符。在元素创建前,解析器在工厂散列表中做个查找。这样就创建了agsXMPP.protocol.client.Message类的一个实例。如果表中不存在name/namespace的绑定,则会创建agsXMPP.Xml.Element的一个实例。所有的XMPP协议类都派生自agsXMPP.Xml.Element。他们都是在内存中保持XML树的'abstract'元素。所有的属性都是'realtimeproperties'。在我们要读取消息体,调用消息体属性时,类将会实时查找body/元素。Creatingyourownpackettypes下面的小例子中我们将要创建一个我们自己的扩展,通过XMPP网络发送天气信息。最简单的方法是将天气的数据信息嵌入到一个message节中。嵌入了天气信息的新XMLmessage如下所示:messagexmlns=jabber:clientto=romeo@montage.netweatherxmlns=agsoftware:weatherhumidity90/humiditytemperature57/temperature/weather/message我们要给这个新的协议创建一个新的命名空间和3个新元素:weather、humidity和temperature首先,我们给我们定制的XML元素创建一个新的类weather.cs,派生自agsXMPP.Xml.Dom.Element。usingSystem;usingagsXMPP.Xml.Dom;namespaceMiniClient{publicclassWeather:Element{publicWeather(){this.TagName=weather;this.Namespace=agsoftware:weather;}publicWeather(inthumidity,inttemperature):this(){this.Humidity=humidity;this.Temperature=temperature;}publicintHumidity{get{returnGetTagInt(humidity);}set{SetTag(humidity,value.ToString());}}publicintTemperature{get{returnGetTagInt(temperature);}set{SetTag(temperature,value.ToString());}}}}然后在元素工厂中注册这个新类。如果不注册,在解析XML流时XML解析器就不会weather对象。我们通过下面的代码注册该类:agsXMPP.Factory.ElementFactory.AddElementType(weather,agsoftware:weather,typeof(Weather));我们在使用agsXMPP处理其它事件时,应该先注册我们自己的元素。现在我们能够创建自己的weathermessage,然后发送:Weatherweather=newWeather(90,57);Jidto=newJid(romeo@montage.net);Messagemsg=newMessage();msg.To=to;//AddourweatherElementmsg.AddChild(weather);//SendthemessageXmppCon.Send(msg);接收此message的另一个应用程序可以像OnMessagehandler那样访问到我们的定制数据:privatevoidXmppCon_OnMessage(objectsender,Messagemsg){if(msg.HasTag(typeof(Weather))){Weatherweather=msg.SelectSingleElement(typeof(Weather))asWeather;Console.WriteLine(weather.Temperature.ToString());Console.WriteLine(weather.Humidity.ToString());}}