1、第8章 创建Web服务器程序,本章要点 8.1 Internet概述 8.2 Web服务器程序简介 8.3 ISAPI编程 8.4 CGI编程 8.5 ISAPI DLL和CGI之间的相互转化 8.6 网络通讯,本章要点,在Internet概述的基础上,对Web服务器程序进行阐述。结合实例说明了ISAPI编程。结合实例说明了CGI编程。,返回本章首页,8.1 Internet概述,8.1.1 统一资源定位器 8.1.2 超文本标记语言 8.1.3 HTTP服务器活动,返回本章首页,8.1.1 统一资源定位器,URL对网络资源的位置提供了一种抽象的识别方法,并用这种方法给资源定位。这里的资源是指
2、Internet上可以被访问的任何对象,包括文件、文档、图像、声音等等,以及与Internet相连的任何形式的数据。URL是一个字符串,它的一般格式如下: 协议:/主机名/脚本文件名/路径信息?查询条件。,返回本节,8.1.2 超文本标记语言,HTML文档通过标记(Tag)和属性(Attribute)对超文本的语义进行描述。HTML虽然本质上并不是编程语言,但它却是在开发HTML文档时必须遵守的一套严格而且简明易懂的语法规则。也就是说,如果一个文档是基于HTML标准的,则可以解释某些标记的含义。,返回本节,8.1.3 HTTP服务器活动,Web浏览器和Web服务器之间通过HTTP协议进行通信。
3、 HTTP请求分为两种类型,一种是GET请求,另一种是POST请求。 Web服务器接收到客户请求之后,将根据配置信息执行一定数量的活动。当Web服务器应用程序完成客户请求之后。必须构造一个HTML页面或其他MIME内容,并传输给客户。,返回本节,8.2 Web服务器程序简介,8.2.1 Web服务器程序的种类 8.2.2 Web服务器应用程序的逻辑结构 8.2.3 调试服务器程序,返回本章首页,8.2.1 Web服务器程序的种类,Delphi 6中可以创建的Web服务器程序包括:CGI程序、Win-CGI程序和ISAPI(Microsoft Server DLL)、NSAPI(Netscape
4、 Server DLL)。,返回本节,8.2.2 Web服务器应用程序的逻辑结构,图8-1 Web服务器程序的逻辑结构,返回本节,8.2.3 调试服务器程序,不同类型的Web服务器程序,需要在支持相应的服务器程序的服务器上进行。调试ISAPI或NSAPI类型的程序,则要求在支持这种服务器程序的服务器上进行。可以在服务器中编写一定的代码,作为用户请求直接调用这些服务器程序生成的DLL;而调试CGI和WinCGI类型的服务器程序就比较困难一些,需要在服务器上执行这些程序,并且需要编写代码作为用户请求的信息。,返回本节,8.3 ISAPI编程,8.3.1 返回静态页面 8.3.2 返回动态页面 8.
5、3.3 接收用户输入的ISAPI DLL 8.3.4 一个完整的Web数据库应用程序,返回本章首页,8.3.1 返回静态页面,其步骤(具体制作如图8-28-10所示): 1新建项目 2程序框架 3创建ActionItem 4为ActionItem编写代码 5设置服务器 6编译ISAPI动态链接库程序 8.调试ISAPI动态链接库,图8-2 选择Web Server Application,图8-3 选择生成Web服务器程序的类型,图8-4 ISAPI动态链接库的框架,图8-5 Action Editor对话框,图8-6 使用对象监视器为ActionItem设置属性,图8-7 选择存放ISAPI
6、动态链接库的目录,图8-8 设置scripts目录为可执行的,图8-9 设置编译后的文件后缀名为dll,图8-10 浏览器中显示由ISAPI动态链接库生成的静态HTML页面,返回本节,8.3.2 返回动态页面,其具体的步骤如下: (1)在projectl项目文件中选择Web Module部件,激活ActionEditor对话框。 (2)在ActionEditor对话框新添加一个ActionItem。 (3)将第二个ActionItem命名为Dynamicdll,PathInfo属性设置为DateTime。 (4)为新建的ActionItem的OnAction事件编写代码。,图8-11 浏览器中
7、显示由ISAPI动态链接库生成的动态HTML页面,返回本节,8.3.3 接收用户输入的ISAPI DLL,1OnAction事件的参数(主要属性如表8-1) 2创建用户输入的HTML页面(创建好的HTML页面如图8-12所示) 3添加PageProducer控件(具体含义如表8-2) 4为项目文件新建一个ActionItem 5调试程序(如图8-138-15所示),表8-1 TwebReques对象的主要属性,图8-12 创建好的用户输入界面,表8-2 MethodType方法的参数值及其含义,图8-13 在用户输入界面中输入数据,图8-14 使用GET方式得到的服务器响应信息,图8-15 使
8、用POST方式得到的服务器响应信息,返回本节,8.3.4 一个完整的Web数据库应用程,1将数据表作为服务器程序的响应信息(如图8-16所示) 2增加查询功能 (Query控件和QueryTableProducer控件的属性设置如表8-3所示),图8-16 作为服务器响应信息输出的数据表,表8-3 控件的属性设置,返回本节,8.4 CGI编程,8.4.1 一个时间显示程序 8.4.2 命令行处理 8.4.3 CGI环境变量 8.4.4 CGI数据库编程,返回本章首页,8.4.1 一个时间显示程序,单击“Project”主菜单下的“Remove from Project”选项,将unit单元从项
9、目文件中移走,然后按下Ctrl+F12键,选择项目文件,使它在代码编辑器中显示出来。在它的Program保留字后加入一个¥APPTYPE CONSOLE编辑器指令,将它转换成控制台应用程序,最后删除大部分项目源代码,如果直接在Delphi环境中运行该程序,则它会打开一个终端窗口,并输出writeln语句的内容,如图8-19所示。,图8-19 在Delphi环境中执行的结果,返回本节,8.4.2 命令行处理,CGI应用程序接收用户输入的方法有两种: (1)使用它的命令行参数识别页面(激活应用程序)的URL,而URL通常在应用程序名后面包括附加的参数。 (2)系统使用一系列环境变量向CGI应用程序
10、进一步传递信息。在Win_CGI中,同样通过INI文件来传递,而没有使用环境变量。,返回本节,8.4.3 CGI环境变量,表8-4 CGI环境变量,返回本节,8.4.4 CGI数据库编程,(1)依次单击“File”“New”“Other”选项,然后在Business页面中选择DB Web Application Wizard,如图8-24所示。单击“OK”按钮,则出现选择Web数据库应用程序类型对话框,如图8-25所示。 (2)单击“Next”按钮,将出现选择数据表对话框,如图8-26所示。选择好数据表后,单击“Next”按钮,将出现选择要显示的字段对话框,如图8-27所示。,选择完需要显示的
11、字段后,单击“Next”按钮,则出现设置Web页面对话框,如图8-28所示。 (3)所有的设置都完成后,则出现确认对话框,如图8-29所示。单击“Finish”按钮,就完成了创建一个Web项目文件的工作。向导为我们生成了WebModule1模块,其中加入了三个控件如图8-30所示。编译并运行该程序,则在浏览器中显示的结果如图8-31所示。,图8-24 利用DB Web Application Wizard向导创建项目文件,图8-25 选择Web数据库应用程序类型,图8-26 选择数据表,图8-27 选择要显示的字段,图8-28 设置Web页面,图8-29 完成创建项目文件,图8-30 向导自动
12、生成的WebModule1模块,图8-31 显示结果,返回本节,8.5 ISAPI DLL和CGI之间的相互转,(1)将编写好并且调试成功的project5.dll创建成一个模板,以便在Win_CGI中使用(如图8-32所示)。 (2)关闭project5项目,在主菜单中选择“New”选项,创建一个新的项目,指定为Win_CGI。 (3)新建项目后,Delphi将自动产生一个缺省的Web Module控件,在加入模板后再将它删除(如图8-33所示)。,返回本章首页,图8-33 加入project5dll模板,图8-32 为模板设置属性,返回本节,8.6 网络通讯Windows Sockets,
13、Windows下网络编程的规范Windows Sockets。这套规范是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。,返回本章首页,Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口. 应用程序调用Windo
14、ws Sockets的API实现相互之间的通讯。 Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图8-33。,8.6.1 Windows Sockets规范,图8-33 应用程序与windows sockets 关系图,一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。 一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务对客户的请求作出适当的反应。这
15、一请求/相应的过程可以简单的用图8-34表示。,8.6.2 客户机/服务器模型,图8-34 客户机/服务器模型,服务端组件:,8.6.3 Delphi中Windows Socket组件,TUdpSocket,TTcpServer,TServerSocket,客户端组件:,TTcpClient,TClientSocket,TUdpSocket,8.6.4 服务端组件使用,每个socket服务端控件对象代表一个服务端点,它可以对一个或多个socket客户端控件对象的活动进行监听,并实现与其连接、通讯。,确定通讯端口(port)监听客户端请求与客户端连接读、写数据关闭服务连接,Socket服务端控件
16、可用于:,以TServerSocket为例:,事件: OnListen、OnAccept、OnGetThread 、OnThreadStart 、OnThreadEnd 、OnClientConnect、OnClientDisconnect、OnClientRead、OnClientWrite 、OnClientError,属性:Active、 Port、 ServerType( stNonBlocking, stThreadBlocking),以TClientSocket为例:,事件: OnLookup 、OnConnecting 、OnConnect 、OnDisconnect 、OnRead 、OnWrite 、OnError,属性:Active、Host 、 Port、 ClientType ( stNonBlocking, stThreadBlocking),实例参见:例子websockettest,