原文:http://www.cnblogs.com/hunts/archive/2006/12/11/588912.html
agsXMPP致力于创建一个轻量、快速的跨平台类库,用于XMPP协议。
通过下面的三项技术,agsXMPP达到了这个目标。
- 异步套接字
- 与工厂模式结合的快速XML解析器
- 自有的轻量级XML Dom,作为所有agsXMPP协议类的基础
我们为什么不直接所用Microsoft的System.Xml命名空间里的类呢?
因为我们决定创建自己的轻量级的Xml Dom,能够飞快地运作,特别是在像PPC's和Smartphones这样的嵌入式设备上。
XmlTextReader有利于SAX-like的解析。但是Microsoft在.NET1.1的SP1中做了下改变,这使得我们不能够再使用它来解析网络流。所以我们需要另外的XML解析器。
类库的惊人之处在哪?
一旦从套接字接收到数据,该数据便由sax-like XML解析器解析。此解析器使用工厂模式来创建agsXMPP协议类相关的元素。
示例:
套接字接收到一条信息,将比特流推送至解析器。XML解析器探测到隶属于jabber:client命名空间中名字为message的开标签符。在元素创建前,解析器在工厂散列表中做个查找。这样就创建了agsXMPP.protocol.client.Message类的一个实例。如果表中不存在name/namespace的绑定,则会创建agsXMPP.Xml.Element的一个实例。
所有的XMPP协议类都派生自agsXMPP.Xml.Element。他们都是在内存中保持XML树的'abstract'元素。所有的属性都是'realtime properties'。在我们要读取消息体,调用消息体属性时,类将会实时查找<body/>元素。
Creating your ownpacket types
下面的小例子中我们将要创建一个我们自己的扩展,通过XMPP网络发送天气信息。最简单的方法是将天气的数据信息嵌入到一个message节中。嵌入了天气信息的新XML message如下所示:
<messagexmlns="jabber:client"to="romeo@montage.net">
<weatherxmlns="agsoftware:weather">
<humidity>90</humidity>
<temperature>57</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处理其它事件时,应该先注册我们自己的元素。
现在我们能够创建自己的weather message,然后发送:
Weatherweather=newWeather(90,57);
Jidto=newJid("romeo@montage.net");
Messagemsg=newMessage();
msg.To=to;
//AddourweatherElement
msg.AddChild(weather);
//Sendthemessage
XmppCon.Send(msg);
接收此message的另一个应用程序可以像OnMessage handler那样访问到我们的定制数据:
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());
}
}
现在我们创建了我们第一个自己的(信息)包,包含了一个message节。接下去我们要创建基于Iqs的小型weather service。
service的raw xml protocol:
Romeo向weather service请求了他城市的天气信息,zip code为'74080':
<iqfrom='romeo@montagne.net'to='weather.mortagne.net'type='get' id='agsXMPP_1'>
<queryxmlns='agsoftware:weather'>
<zip>74080</zip>
</query>
</iq>
接着weather service查找该zip code的天气数据,然后返回结果给Romeo:
<iqto='romeo@montagne.net'from='weather.mortagne.net'type='result' id='agsXMPP_1'>
<queryxmlns='agsoftware:weather'>
<humidity>90</humidity>
<temperature>57</temperature>
<zip>74080</zip>
</query>
</iq>
Weather.cs的源代码:
usingSystem;
usingagsXMPP.Xml;
usingagsXMPP.Xml.Dom;
publicclassWeather:Element
{
publicWeather()
{
this.TagName="query";
this.Namespace="agsoftware:weather";
}
publicintHumidity
{
get{returnGetTagInt("humidity");}
set{SetTag("humidity",value.ToString());}
}
publicintTemperature
{
get{returnGetTagInt("temperature");}
set{SetTag("temperature",value.ToString());}
}
publicintZip
{
get{returnGetTagInt("zip");}
set{SetTag("zip",value.ToString());}
}
}
WeatherIq.cs的源代码:
usingSystem;
usingagsXMPP;
usingagsXMPP.protocol.client;
publicclassWeatherIq:IQ
{
privateWeatherm_Weather=newWeather();
publicWeatherIq()
{
base.Query=m_Weather;
this.GenerateId();
}
publicWeatherIq(IqTypetype)
:this()
{
this.Type=type;
}
publicWeatherIq(IqTypetype,Jidto)
:this(type)
{
this.To=to;
}
publicWeatherIq(IqTypetype,Jidto,Jidfrom)
:this(type,to)
{
this.From=from;
}
publicnewWeatherQuery
{
get
{
returnm_Weather;
}
}
}
当然我们要在工厂里注册Weather对象,使用下面代码:
agsXMPP.Factory.ElementFactory.AddElementType("weather",
"agsoftware:weather",typeof(Weather));
Romeo的客户端使用WeatherIq对象创建了请求Iq包:
WeatherIqwIq=newWeatherIq(IqType.get);
wIq.To=newJid("weather.mortagne.net");
wIq.From=newJid("romeo@montagne.net");
wIq.Query.zip=74080;
//Sendthemessage
XmppCon.Send(wIq);
weather service在Iq handler中接收此请求,然后把响应发回给Romeo。在weather service中获得请求信息,然后编辑:
privatevoidXmppCon_OnIq(objectsender,agsXMPP.Xml.Dom.Nodee)
{
IQiq=easIQ;
Elementquery=iq.Query;
if(query!=null)
{
if(query.GetType()==typeof(Weather))
{
//itsaWeatherIQ
Weatherweather=queryasWeather;
if(iq.Type==IqType.get)
{
Console.WriteLine(weather.Zip.ToString());
//readthezipcodeandlookuptheweather
//dataforthiszipcode
//....
iq.SwitchDirection();
iq.Type=IqType.result;
weather.Humidity=90;
weather.Temperature=57;
//Sendtheresultbacktoromeo
XmppCon.Send(iq);
}
}
}
}
Romeo接收到响应,然后通过我们的weather对象的属性访问到天气数据。
<!-- Search Google -->
输入您的搜索字词 提交搜索表单
|
|
<!--
google_ad_client = "pub-7330597899926046";
google_ad_format = "350x30_sdo";
google_link_target = 2;
google_color_bg = "ffffff";
google_color_link = "000000";
google_encoding = "GB2312";
//-->
|
<!-- Search Google --> <!--
google_ad_client = "pub-7330597899926046";
google_ad_slot = "8791774696";
google_ad_width = 468;
google_ad_height = 60;
//-->
分享到:
相关推荐
This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first ...
斯坦福教授、Tcl 语言发明者 John Ousterhout 的著作《A Philosophy of Software Design》,自出版以来,好评如潮。按照 IT 图书出版的惯例,如果冠名为“实践”,书中内容关注的是某项技术的细节和技巧;冠名为...
Software Design X-Rays Fix Technical Debt with Behavioral Code Analysis 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
This is the definitive book for all C++ software professionals involved in large development efforts such as databases, operating systems, compilers, and frameworks. It is the first C++ book that ...
A Philosophy of Software Design英文原版 “Writing computer software is one of the purest creative activities in the history of the human race. Programmers aren’t bound by practical limitations such ...
Software Design Methodology
软件设计规范(Software Design Specification, SDS)是软件开发过程中一个重要的文档。它不仅明确了软件的设计思路和技术细节,还为团队成员提供了共同的工作基础。本文档旨在提供一个灵活而全面的SDS模板,以指导...
What methods and processes are there to help you design software? Is designing small programs different from designing large ones? How can you tell a good design from a bad one? What general patterns...
Programming on Purpose - Essays on Software Design
Software Design Methodology 软件设计方法论上
软件设计文档(Software Design Document)是一种详细记录软件开发设计的文件,旨在描述软件的架构、组件、接口和数据模型等方面的设计细节。软件设计文档通常包括软件的概述、功能设计、数据模型设计、系统架构设计...
Software Design Methodologies 软件设计方法论介绍
Global Common Control Software Design(机器人概念).pptx
Semantic Software Design: A New Theory and Practical Guide for Modern Architects With this practical book, architects, CTOs, and CIOs will learn a set of patterns for the practice of architecture, ...
IEEE 1016-2009标准是信息技术领域内一个专门针对软件设计描述文档(Software Design Descriptions,简称SDDs)的文档标准。该标准详细阐述了软件设计描述应当包含的信息内容和组织结构,并规定了用于一致性SDD的...