应用开发的分类
•客户
•服务器
•服务器端应用程序
应用开发方法
•使用编程接口
•使用动态链接库或控件
本讲内容
客户程序客户程序
• • 协议作为的技术组件之一为的成功奠定了重要的基础它协议作为的技术组件之一为的成功奠定了重要的基础它
提供了客户和服务器进行交互的机制并对交互的语法和语提供了客户和服务器进行交互的机制并对交互的语法和语
义制定了统一的标准义制定了统一的标准
• • 上很多应用的开发都与协议有着关联或者围绕着协议展上很多应用的开发都与协议有着关联或者围绕着协议展
开或者需要协议的支持开或者需要协议的支持
• • 可以说协议贯穿了上多个层次的应用开发如图所示可以说协议贯穿了上多个层次的应用开发如图所示
• • 从该图中可以看出应用可以分为三种类型客户程序从该图中可以看出应用可以分为三种类型客户程序
– – 客户程序客户程序
• • 客户程序可以看作是一种用户代理客户程序可以看作是一种用户代理 , ,它的作用是它的作用是
代表用户和服务器进行交互代表用户和服务器进行交互,,以实现下载文档提交以实现下载文档提交
信息等目的。信息等目的。
• • 一些典型的客户程序包括一些典型的客户程序包括
» » 浏览器:其用途主要是供用户浏览服务器上的文浏览器:其用途主要是供用户浏览服务器上的文
档。例如档。例如 等等
» » 文档下载工具:其用途主要是采用断点续传多线文档下载工具:其用途主要是采用断点续传多线
程等手段帮助用户快速地从服务器上下载资源。程等手段帮助用户快速地从服务器上下载资源。
例如例如 等等
» » :: 其用途主要是出于信息检索等目的而对遍历,其用途主要是出于信息检索等目的而对遍历,
即从某个开始沿着上的超链采用深度优先或广度即从某个开始沿着上的超链采用深度优先或广度
优先的方法来下载所有的页面。例如等搜索引擎优先的方法来下载所有的页面。例如等搜索引擎
中均使用了这种程序中均使用了这种程序
客户程序的基本功能客户程序的基本功能
虽然上述各个客户程序的作用和实现方法各不相同,但虽然上述各个客户程序的作用和实现方法各不相同,但
至少都具备以下两项基本功能:至少都具备以下两项基本功能:
» » 与用户的交互与用户的交互
提供人机交互的手段可视化界面或者命令行方式供用户来提供人机交互的手段可视化界面或者命令行方式供用户来
表达其要求,同时将执行的结果展现给用户。表达其要求,同时将执行的结果展现给用户。
对于最终用户而言,要求他们掌握中的各种消息的语法和对于最终用户而言,要求他们掌握中的各种消息的语法和
语义是不现实的,因此人机交互要尽可能地简单直观。例语义是不现实的,因此人机交互要尽可能地简单直观。例
如在浏览器中,用户仅给出要浏览的页面的地址就可以看如在浏览器中,用户仅给出要浏览的页面的地址就可以看
到该页面,至于使用协议来实现这一目的细节对用户是透到该页面,至于使用协议来实现这一目的细节对用户是透
明的,这些工作应该由客户程序代替用户完成。明的,这些工作应该由客户程序代替用户完成。
» » 与服务器的交互与服务器的交互
根据用户提出的要求按照协议规范和服务器进行交互,以完成用根据用户提出的要求按照协议规范和服务器进行交互,以完成用
户的要求户的要求
处理如何和服务器建立连接,使用何种语法格式来发送请求消息、处理如何和服务器建立连接,使用何种语法格式来发送请求消息、
如何解释服务器的响应消息等问题。这一切都要遵循协议中给出如何解释服务器的响应消息等问题。这一切都要遵循协议中给出
的规定的规定
可以看出,一个客户程序实际上是协议内容的部分实现。因此要可以看出,一个客户程序实际上是协议内容的部分实现。因此要
能够开发客户程序就应该透彻地理解协议中给出的客户和服务器能够开发客户程序就应该透彻地理解协议中给出的客户和服务器
的交互机制,正确地掌握各种消息的语法和语义规范的交互机制,正确地掌握各种消息的语法和语义规范
需要说明的是除了要实现上述基本功能以外客户程序可能还要具需要说明的是除了要实现上述基本功能以外客户程序可能还要具
备一些与协议本身无关的功能例如一个浏览器备一些与协议本身无关的功能例如一个浏览器
除了能够根据用户的要求将指定的页面下载下来,还要能够按照除了能够根据用户的要求将指定的页面下载下来,还要能够按照
规范对该页面进行解析,并在可视化的界面上将其展现出来规范对该页面进行解析,并在可视化的界面上将其展现出来
下面我们以浏览器为例对客户程序的内部
结构进行粗略的分析
该浏览器由以下几个部分组成:该浏览器由以下几个部分组成:
用户接口:接收用户的输入,并将服务器返回的响应展示给用户。用户接口:接收用户的输入,并将服务器返回的响应展示给用户。
用户输入解析器:对用户输入进行解析,并将结果传送给控制器。用户输入解析器:对用户输入进行解析,并将结果传送给控制器。
控制部分:是浏览器的核心部分,负责协调各个部件的运作。控制部分:是浏览器的核心部分,负责协调各个部件的运作。
客户:如果用户的输入是要求访问服务器,那么就将其以请求消息客户:如果用户的输入是要求访问服务器,那么就将其以请求消息
的形式提交给服务器,并接收和解析服务器的响应。的形式提交给服务器,并接收和解析服务器的响应。
其它客户用户:可能还会访问上的等服务,因此需要有基于相应协其它客户用户:可能还会访问上的等服务,因此需要有基于相应协
议的客户部分,例如客户。议的客户部分,例如客户。
解析器:如果服务器返回的消息中包含文件,那么对其按照语法进解析器:如果服务器返回的消息中包含文件,那么对其按照语法进
行解析。行解析。
其它解析器:如果文件中包含脚本语言等成分,例如,其它解析器:如果文件中包含脚本语言等成分,例如, 那么对其按那么对其按
照相应的规范进行解析,在后面的章节中我们将对进行详细讨论。照相应的规范进行解析,在后面的章节中我们将对进行详细讨论。
格式化显示:将解析结果输出到可视化界面上供用户浏览。格式化显示:将解析结果输出到可视化界面上供用户浏览。
服务器程序服务器程序
– – 服务器服务器
服务器程序的作用是为用户提供服务。例如返回用户想浏览的文档服务器程序的作用是为用户提供服务。例如返回用户想浏览的文档
等,为了实现这一目标,服务器程序必须按照协议规范和客户进行交等,为了实现这一目标,服务器程序必须按照协议规范和客户进行交
互。互。
» » 如何和客户建立连接如何和客户建立连接
» » 如何解释客户的请求消息如何解释客户的请求消息
» » 如何按照用户的要求执行相应的处理如何按照用户的要求执行相应的处理
» » 使用何种语法格式来将处理结果作为响应消息返回给客户使用何种语法格式来将处理结果作为响应消息返回给客户
一个服务器程序实际上也是协议内容的部分实现,因此一个服务器程序实际上也是协议内容的部分实现,因此
要能够开发服务器程序也应该透彻地理解协议中给出的客户要能够开发服务器程序也应该透彻地理解协议中给出的客户
和服务器交互机制,正确地掌握各种消息的语法和语义规范。和服务器交互机制,正确地掌握各种消息的语法和语义规范。
需要说明的是除了要实现上述基本功能以
外,服务器程序还要具备其它的一些功能:
» 能够将客户提交的信息传递给程序或脚
本等服务器端应用程序
» 接收服务器端应用程序的输出结果等
» 这些功能的实现又依赖于服务器与服务
器端应用程序的接口规范,例如、 等。如
图所示:
–
作为客户和服务器之间的中介,等系统也
是一种基于的应用程序
从客户的角度来看,能够接收客户提出的
请求,并向客户返回响应,因此可以看作
是客户应用程序的服务器。
从服务器的角度来看,能够向服务器提出
请求,并接收服务器返回的响应,因此可
以看作是服务器应用程序的客户。
在开发代理时,要同时实现协议对客户和
服务器的要求,并加入一些额外的中间处
理,例如代理的访问认证、日志与计费、
缓存控制等。
服务器端应用程序的开发者最好能够理解客户和服务器的服务器端应用程序的开发者最好能够理解客户和服务器的
交互机制,掌握一些消息的语法和语义,交互机制,掌握一些消息的语法和语义, 需要说明的是除需要说明的是除
了要实现上述基本功能以外,服务器程序还要具备其它的了要实现上述基本功能以外,服务器程序还要具备其它的
一些功能,例如一些功能,例如
» » 能够根据用户提交的信息对数据库服务器进行访问能够根据用户提交的信息对数据库服务器进行访问
» » 访问等其它服务访问等其它服务
» » 这些功能的实现又依赖于其它的一些规范例如这些功能的实现又依赖于其它的一些规范例如 (( )、)、
(( )和)和 (( )) 等,有关这些规范的内容不属于本课程的等,有关这些规范的内容不属于本课程的
范畴,感兴趣的可以参见相关资料。范畴,感兴趣的可以参见相关资料。
在上面介绍的三种应用中客户和服务器与协在上面介绍的三种应用中客户和服务器与协
议密切相关。议密切相关。
下面我们对这两种应用的开发方法进行介绍,关于服务器端应用程下面我们对这两种应用的开发方法进行介绍,关于服务器端应用程
序的开发,我们将在后续对序的开发,我们将在后续对 和和 部分进行介绍。部分进行介绍。
应用程序通常建立在系统提供的应用编程接口(应用程序通常建立在系统提供的应用编程接口(
)) 之上应用程序的开发也不例外。之上应用程序的开发也不例外。
按照所使用抽象层次的不同,我们将其分为两种:按照所使用抽象层次的不同,我们将其分为两种:
一种使用的是网络层的应用编程接口,例如和平台一种使用的是网络层的应用编程接口,例如和平台
上的上的 等。等。
另一种使用的是应用层上的编程接口,例如平台上提供另一种使用的是应用层上的编程接口,例如平台上提供
的的 和和 等。等。
使用编程接口
接口是网络最为通用的之一,它提供了很
多函数和例程供我们来开发网络上的应用
程序。
此处我们不对编程的细节进行介绍,仅给
出了使用接口来实现客户和服务器的一般
方法,如图所示。
在该图中所有的函数用英文标出,而对消
息的处理用中文标出。
– – 服务器应用程序的开发服务器应用程序的开发
首先,使用首先,使用( )( )来生成一个来生成一个 ,并通过,并通过( )( )将该绑定到端口将该绑定到端口
然后使用然后使用( )( )来侦听客户的连接请求来侦听客户的连接请求
当客户的连接请求到达后,使用当客户的连接请求到达后,使用( )( )来和客户建立连接来和客户建立连接
接着使用接着使用( )( )来读取客户发来的请求消息来读取客户发来的请求消息
当收到请求消息后,就要按照协议对消息进行解析当收到请求消息后,就要按照协议对消息进行解析
根据客户的请求执行相应的处理程序,例如读取指定的文根据客户的请求执行相应的处理程序,例如读取指定的文
件件
之后服务器将执行结果封装为符合协议的响应消息之后服务器将执行结果封装为符合协议的响应消息
使用使用( )( )将响应消息发送给客户将响应消息发送给客户
这样,一次交互结束。服务器又可以为另一个客户请求服这样,一次交互结束。服务器又可以为另一个客户请求服
务了务了
– – 在客户应用程序的开发在客户应用程序的开发
当用户提出某个要求时当用户提出某个要求时,,客户程序首先将用户的要求封装客户程序首先将用户的要求封装
为符合协议规定的请求消息为符合协议规定的请求消息
然后然后,,使用使用( )( )来生成一个来生成一个, , 并通过并通过( )( )来请求和服务器建立连来请求和服务器建立连
接接
在成功地建立连接后在成功地建立连接后,,客户使用客户使用( )( )将请求消息发送给服务器将请求消息发送给服务器
在服务器返回响应后在服务器返回响应后,,客户使用客户使用( )( )来读取服务器的响应消来读取服务器的响应消
息息,,并按照协议对消息进行解析并按照协议对消息进行解析,,例如从消息实体中提取出例如从消息实体中提取出
用户所需要浏览的文件用户所需要浏览的文件
之后之后,,将服务器的响应展现给用户将服务器的响应展现给用户
这样这样,,客户便完成了用户所提出的一个要求客户便完成了用户所提出的一个要求
– – 的优缺点的优缺点
优点优点
– – 在使用在使用 这种网络编程接口来开发应用程序时这种网络编程接口来开发应用程序时,,开发者可以深入到应用开发者可以深入到应用
的底层的底层,,能够直接控制和上细节能够直接控制和上细节,,从而便于实现一些高级的特性从而便于实现一些高级的特性
缺点缺点
– – 它对开发者的要求比较高它对开发者的要求比较高,,开发者必须要透彻地理解协议开发者必须要透彻地理解协议,,同时要熟悉同时要熟悉
网络和编程网络和编程
– – 此外开发过程也比较复杂此外开发过程也比较复杂,,开发者必须处理许多细节问题开发者必须处理许多细节问题::例如数据包例如数据包
的封装与解析、网络字节序的转换、收发缓冲区的开辟与释放等等的封装与解析、网络字节序的转换、收发缓冲区的开辟与释放等等
使用动态链接库或者控件使用动态链接库或者控件
为了适应快速开发应用程序的要求,我们可以使用一些为了适应快速开发应用程序的要求,我们可以使用一些
现成的动态链接库或者控件。例如提供的现成的动态链接库或者控件。例如提供的 和和 等。等。
这些函数库和控件本身已经实现了客户的功能,并将其通这些函数库和控件本身已经实现了客户的功能,并将其通
过提供出来供开发者调用。过提供出来供开发者调用。
这样,我们在开发应用程序时就不需要涉及到和的细节就这样,我们在开发应用程序时就不需要涉及到和的细节就
可以方便地使用等服务,从而加快了应用开发的速度可以方便地使用等服务,从而加快了应用开发的速度
严格地说,此时我们开发的不并是客户本身,而是一个客严格地说,此时我们开发的不并是客户本身,而是一个客
户的外包装程序,与真正密切相关的部分已经在函数库或户的外包装程序,与真正密切相关的部分已经在函数库或
控件的内部完成了控件的内部完成了
下面,我们介绍如何使用下面,我们介绍如何使用 控件来开发客户端控件来开发客户端
应用,在此我们使用的开发工具是应用,在此我们使用的开发工具是 ,, 其它的开其它的开
发工具,例如发工具,例如 或者等也同样可以使用。或者等也同样可以使用。
控件控件
控件是提供的一种控件,它支持协议和控件是提供的一种控件,它支持协议和
协议,在使用该控件时我们只需要对该控件设置协议,在使用该控件时我们只需要对该控件设置
一些属性并调用一些方法就可以实现一些基于的一些属性并调用一些方法就可以实现一些基于的
功能。例如下载文件、向服务器提交数据等功能。例如下载文件、向服务器提交数据等
– – 控件属性控件属性
控件包含了很多属性,其中比较重要的有控件包含了很多属性,其中比较重要的有
:该属性给出了客户所请求资源的:该属性给出了客户所请求资源的 ,该属性值会作为请求,该属性值会作为请求
消息中的发送给服务器消息中的发送给服务器
:: 该属性决定了控件用来与服务器进行通讯的访问类型,该属性决定了控件用来与服务器进行通讯的访问类型,
通过代理访问或直接访问,其取值可以有三种通过代理访问或直接访问,其取值可以有三种
» » ()() 表示使用注册表中找到的缺省设置值表示使用注册表中找到的缺省设置值
» » ()() 表示直接连到表示直接连到
» » (( )) 表示使用指定的代理服务器表示使用指定的代理服务器
:该属性决定使用的代理服务器的名称,只有当控件的属性设置为:该属性决定使用的代理服务器的名称,只有当控件的属性设置为
() () 时才使用该属性时才使用该属性
– – 控件属性续控件属性续
:该属性表示用户名称,当服务器需要客户给出认证信息时,可以:该属性表示用户名称,当服务器需要客户给出认证信息时,可以
对该属性进行设置,该属性值会包含在请求消息的头字段中发送给服对该属性进行设置,该属性值会包含在请求消息的头字段中发送给服
务器务器
:: 该属性表示与用户名称相关联的用户密码,该属性和一起作为客该属性表示与用户名称相关联的用户密码,该属性和一起作为客
户的认证信息提供给服务器户的认证信息提供给服务器
:: 如果控件访问服务器时发生了错误,那么该属性中记录了错误的如果控件访问服务器时发生了错误,那么该属性中记录了错误的
代码代码
:: 该属性与类似,它给出了对所发生错该属性与类似,它给出了对所发生错
误的文字性描述误的文字性描述
使用控件开发客户端应用(续)
该方法要求远程服务器执行用户指定的操作,相当于向该方法要求远程服务器执行用户指定的操作,相当于向
服务器发送请求消息服务器发送请求消息
» » 该方法的语法为该方法的语法为([], [], [],([], [], [],
[]) []) 其中表示被请求消息中包含的,其中表示被请求消息中包含的, 表示将要执行的操作表示将要执行的操作
类型,其取值为的请求方法,例如类型,其取值为的请求方法,例如“” “” “”“” “” “”等,指定了用于等,指定了用于
“ ”“ ”或或“”“”等操作中向服务器提交的实体,指定了向远程服务等操作中向服务器提交的实体,指定了向远程服务
器提交的请求头字段,例如传来的附加的标头器提交的请求头字段,例如传来的附加的标头
» » 可以看出,通过设定的参数,可以决定请求消息中包含可以看出,通过设定的参数,可以决定请求消息中包含
的请求方法资源的请求方法资源 头字段等各种内容头字段等各种内容
» » 方法以异步方式传输数据,方法以异步方式传输数据, 方法在调用后会立刻返回而方法在调用后会立刻返回而
不会等待服务器的响应返回,而服务器返回的数据通常可不会等待服务器的响应返回,而服务器返回的数据通常可
以在后台用方法进行以在后台用方法进行
该方法能够读取从服务器返回数据,这些数据通常是该方法能够读取从服务器返回数据,这些数据通常是
包含在服务器响应消息中的实体包含在服务器响应消息中的实体
» » 该方法的语法为该方法的语法为( [] ) ( [] ) 其中其中 表示要读取的数据块的大小,指定数据类表示要读取的数据块的大小,指定数据类
型,其取值可以为以下两种型,其取值可以为以下两种
表示把数据作为字符串来读取表示把数据作为字符串来读取
表示把文档内容作为二进制字节数组来读取表示把文档内容作为二进制字节数组来读取
» » 通常我们在控件的事件中调用该方法通常我们在控件的事件中调用该方法
该方法能够从服务器返回的响应消息中读取头字段该方法能够从服务器返回的响应消息中读取头字段
» » 其语法格式为其语法格式为 () () 其中表示要读取的头字段的名称其中表示要读取的头字段的名称
» » 通常我们可以在执行后调用该方法,也可以在控件的事件中调用该通常我们可以在执行后调用该方法,也可以在控件的事件中调用该
方法方法
– – 控件的事件控件的事件
控件能够产生一个重要的事件控件能够产生一个重要的事件
含义:该事件的发生标志着控件与服务器交互的状态有了变化,其含义:该事件的发生标志着控件与服务器交互的状态有了变化,其
具体的状态值在事件的参数中给出具体的状态值在事件的参数中给出
用途用途
当客户端使用这种异步方法时,可以利用该事件来当客户端使用这种异步方法时,可以利用该事件来
观察交互的状态观察交互的状态
» » 通常可以在该事件中将输出到文件中通常可以在该事件中将输出到文件中
» » 也可以在为也可以在为 () ()时调用方法来读取从服务器返回的数据时调用方法来读取从服务器返回的数据
下表中给出了事件的各种状态下表中给出了事件的各种状态
下面我们介绍如何使用开发客户端应用下面我们介绍如何使用开发客户端应用
是提供的一个函数库,它对是提供的一个函数库,它对 等协议进行了抽象,并提供了高层的接等协议进行了抽象,并提供了高层的接
口应用程序,可以利用这些来访问等协议,从而实现应用程序开发口应用程序,可以利用这些来访问等协议,从而实现应用程序开发
在利用来开发应用时,可以使用在利用来开发应用时,可以使用 也可以使用等也可以使用等
此处我们不再象介绍此处我们不再象介绍 控件那样详细地给出各个的解释,而是通过一控件那样详细地给出各个的解释,而是通过一
个具体的例子给出使用开发客户端应用的主要步骤个具体的例子给出使用开发客户端应用的主要步骤
希望通过这个例子一方面能够对如何快速开发客户应用程序有一个希望通过这个例子一方面能够对如何快速开发客户应用程序有一个
具体的了解,另一方面能够加深对协议的理解具体的了解,另一方面能够加深对协议的理解
一个示例一个示例
我们希望开发一个客户端应用具有以下一些功能我们希望开发一个客户端应用具有以下一些功能
功能功能 能够接收用户的输入,并根据用户要求获取远程服能够接收用户的输入,并根据用户要求获取远程服
务器上的资源务器上的资源
功能功能 能够显示出客户和服务器交互过程中的消息内容能够显示出客户和服务器交互过程中的消息内容
功能功能 能够将获取的文件资源的保存到本地的指定能够将获取的文件资源的保存到本地的指定
功能功能 利用来显示所获取的文件资源利用来显示所获取的文件资源
参见示例程序参见示例程序
主要实现步骤
该函数用于初始化 的使用,它让 初始化
一个数据结构,并返回一个有效的句柄供
后续的函数使用
主要实现步骤
该函数用于打开与指定站点的一个 , 如
果连接成功那么该函数将返回一个有效的
句柄
主要实现步骤主要实现步骤
该函数用于创建一个请求的数据结构,在数据结构中包该函数用于创建一个请求的数据结构,在数据结构中包
含了要发送给服务器的请求,以及作为请求的一部分的头含了要发送给服务器的请求,以及作为请求的一部分的头
字段,该函数如果执行成功的话,则返回一个有效的请求字段,该函数如果执行成功的话,则返回一个有效的请求
句柄句柄
主要实现步骤主要实现步骤
该函数用于向请求中添加一个或多个请求头字段,每个该函数用于向请求中添加一个或多个请求头字段,每个
头字段以作为结束标记。该函数如果执行成功的话,则返头字段以作为结束标记。该函数如果执行成功的话,则返
回,回, 当客户程序比较复杂,需要对发送给服务器的请求消当客户程序比较复杂,需要对发送给服务器的请求消
息进行细节性控制时,通常会使用该函数,从而添加一些息进行细节性控制时,通常会使用该函数,从而添加一些
额外的、自由格式对头字段。额外的、自由格式对头字段。
主要实现步骤主要实现步骤
该函数用于将请求发送给服务器,该函数如果执行成功该函数用于将请求发送给服务器,该函数如果执行成功
的话,则返回的话,则返回 。当客户程序需要向服务器发送额外的头字。当客户程序需要向服务器发送额外的头字
段,或在、段,或在、 等方法中向服务器提交数据时,该函数也可以等方法中向服务器提交数据时,该函数也可以
实现这些功能。实现这些功能。
主要实现步骤主要实现步骤
该函数用于读取请求或响应信息。该函数如果执行成功该函数用于读取请求或响应信息。该函数如果执行成功
的话,则返回。的话,则返回。 客户程序可以使用该函数来读取向服务器客户程序可以使用该函数来读取向服务器
所发送的请求消息。同时,在客户向服务器发送完请求后,所发送的请求消息。同时,在客户向服务器发送完请求后,
服务器将向客户返回响应,包括:状态码、响应头等。这服务器将向客户返回响应,包括:状态码、响应头等。这
些信息保存在客户端中,客户程序可以使用该函数来读取些信息保存在客户端中,客户程序可以使用该函数来读取
这些响应信息。这些响应信息。
主要实现步骤主要实现步骤
该函数用于读取服务器返回的实体数据。该函数如果执该函数用于读取服务器返回的实体数据。该函数如果执
行成功的话,则返回。行成功的话,则返回。 当服务器收到客户的请求后,除了当服务器收到客户的请求后,除了
会返回状态码响应头以外,还可能会返回实体信息,客户会返回状态码响应头以外,还可能会返回实体信息,客户
端可以反复使用该函数来获取服务器返回的实体数据,直端可以反复使用该函数来获取服务器返回的实体数据,直
到为,到为, 这就好像从本地文件读取信息时遇到了。这就好像从本地文件读取信息时遇到了。
主要实现步骤
该函数用于关闭已经打开的句柄,例如,
使用 等函数所打开的句柄。该函数如果执
行成功的话,则返回。
作业
作业
作业
作业
作业
作业
– 要求
程序设计语言: 等
应用开发方法: 可以使用或者
– 形式
以小组为单位 人组
– 提交
简单的设计说明
实现的源代码和可执行程序
总结