• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:16来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

1. 创建项目
实际上,我们不需要编写一个We b服务器。我们要编写的是一个类似于We b服务器的东西。
我们将使用老式的M F C,因为我恰巧喜欢M F C的套接字类,而且它需要某种形式的用户界面;
另外,你也可以使用Visual Basic的Wi n S o c k控件,或者AT L的纯WinSock API。然而,在开始之
前,我们要确认已经关闭了I I S或个人We b服务器,以及其他能够优先访问端口8 0的程序。否则,
我们自己的服务器无法监听端口8 0。如前所述,将来S O A P可能有自己的端口,这样We b服务器
和S O A P就能够一起运行。如果你不愿意关闭或重新设置We b服务器,可以为S O A P选择其他端
口。你要使用MFC AppWi z a r d创建基于对话框的项目,并确认选择了套接字复选框。
我们需要两个与套接字相关的类:“主”类和“客户”类。“主”类C O p e r a M a i n S o c k e t派生
出的对象用于监听8 0 端口, 接收进入服务器的调用。当它接收到调用时, 它创建
C O p e r a C l i e n t S o c k e t对象。实际上,完全可以将与套接字相关的所有内容都放在一个类中,但是
我个人认为这种方式能够提高程序的可读性。这两个类都继承了标准的M F C类C A s y n c S o c k e t。
2. 主套接字类
“主”套接口类重载了一个标准方法: O n A c c e p t ( )。以下代码是类定义。你需要将突出显示
的行是要添加到MFC AppWi z a r d生成的代码中:
程序清单1 8 - 2 2
780使用XML 高级编程
下载
添加的新成员变量是一个对象数组,我们用它保存指向客户套接字对象的指针。以下是该
类的构造方法和析构方法:
程序清单1 8 - 2 3
我们所要做的是将信息写入客户套接字数组。真正的操作是在重载的O n A c c e p t ( )方法中执行
的,可以通过MFC Class Wi z a r d添加该方法:
程序清单1 8 - 2 4
第18章实例研究4—SOAP使用781 下载
以上代码创建处理通信过程的客户套接字,接收进入服务器的T C P / I P调用,并将它添加到
数组中。后半部分代码(从c s S t a t u s声明向前开始)用于向主对话框C O p e r a S e r v e r D l g输入某些状
态信息,我们稍后将介绍该对话框。
主套接字类中还有一个方法:
程序清单1 8 - 2 5
该方法检查客户套接字是否关闭。如果某个套接字关闭,它将从数组中被删除。由于这是
客户套接字,我们需要知道它是否关闭,因此必须执行该操作。实际上,该方法是在主对话框
的一个计时器中调用的。同样,我们将在介绍C O p e r a S e r v e r D l g的代码时,进一步描述有关内
容。
3. 客户套接字类
现在,让我们看看客户套接字类。该类用于处理与一个客户的交互。你需要重载两个方法:
O n C l o s e ( )和O n R e c e i v e ( )。当套接字关闭时,调用O n C l o s e ( );当套接字接收到数据时,调用
O n R e c e i v e ( )。以下是类定义:
程序清单1 8 - 2 6
782使用XML 高级编程
下载
请注意定义前面的智能指针部分( #define SMART P T R _ T Y P E D E F ( x )等)—我们可以利用
它在不跟踪引用计数的情况下访问订单C O M对象。由于这是AT L的特征,而不是M F C自动提供的,
因此使用它要略微复杂一些。另外,# i m p o r t行建立了访问MSXML COM对象所需的智能指针。
客户套接字类的构造方法和析构方法非常普通:
程序清单1 8 - 2 7
重载的O n C l o s e ( )方法也非常简单:
程序清单1 8 - 2 8
第18章实例研究4—SOAP使用783 下载
它向主对话框输出适当的消息,然后将激活标志设置为f a l s e,这样主套接口的C h e c k ( )方法
下次检查时就能够发现该套接口关闭了。
重载的O n R e c e i v e ( )方法比较复杂:
程序清单1 8 - 2 9
如果发现错误状态,我们要将请求的内容读入缓存。严格意义上讲,我们应该将它拷贝至
循环缓存,当接收完一行之后再进行处理。T C P / I P不介意消息的边界,它可能先接收半个消息,
或者一个半消息。然而,为了简化程序,我们假设它仅接收一个完整的消息。消息解析过程与
OperaClient COM对象中的解析过程极其类似:
程序清单1 8 - 3 0
784使用XML 高级编程
下载
第18章实例研究4—SOAP使用785 下载
以上代码与OperaClient COM对象中相应代码的主要区别体现在以下两方面:以上代码使用
R e c e i v e ( )方法,而不是recv() API调用;以上代码通过将消息发送回发出调用的客户进行错误处
理,而不是使用A l t R e p o r t E r r o r ( )报告给客户。
与C O M对象类似,真正的核心是P r o c e s s C o n t e n t ( )方法:
程序清单1 8 - 3 1
此处的代码与OperaClient COM对象在需求上存在差别:如果不存在订单对象,我们需要创
建一个新的订单对象:
程序清单1 8 - 3 2
然后,我们可以通过类似的方式利用XML DOM解析内容:
程序清单1 8 - 3 3
786使用XML 高级编程
下载
然而,这次我们真正要调用方法了。首先是一个无参数的方法:
程序清单1 8 - 3 4
然后是含一个参数的方法:
程序清单1 8 - 3 5
最后,我们要构造包含结果的S O A P应答,并发送它:
程序清单1 8 - 3 6
第18章实例研究4—SOAP使用787 下载
另外,还有两个辅助方法,它的功能非常清晰:
程序清单1 8 - 3 7
需要特别说明的是,你可以构造一个更复杂的O P E R A服务器,它将过滤并处理相关的S O A P
调用,而将其他请求发送给另一台运行真正的We b服务器的机器。
4. 主对话框
最后,我们快速介绍一下主对话框。除了O n I n i t D i a l o g ( ) 之外,还有一个重载方法:
O n Ti m e r ( )。
对话框本身非常简单,它包含一个无序列表框I D C _ S TAT U S,以及三个按钮: I D C _ S TA RT,
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程下(77)