用Powerbuilder进行分布式应用开发三级体系结构在线教程
我们一般所开发的数据库应用是基于Client/Server结构的,是两层体系结构。
1、 第一层是客户端的界面和逻辑计算,用PowerBuilder 开发出的应用主要是第一层,运行于客户端。
2、 第二层是数据库和服务器组件。即安装在服务器端的数据库管理系统,应用软件在服务器端进行的操作主要是数据存储和检索。 在两层结构中会有一些逻辑计算以存储过程和触发器的形式存在服务器端,以提高系统性能,但大多数的应用逻辑是放在客户端的。
三层结构是将系统分为有三个不同的“层”:界面,逻辑计算和数据库。界面层是用户界面,数据层是服务器上的数据,逻辑计算是指程序中的计算和控制。
MIS系统越来越复杂,计算和控制越来越多,客户机的负担越来越重,因此需要将逻辑计算从系统中分离出来,单独作为一层,于是就形成了三层结构。逻辑计算的软件被客户机调用,完成一定的逻辑计算,称之为应用服务器。
网络中,可以有多个应用服务器,为客户机或其它的应用服务器提供专业服务,这样,三层结构就发展成为了n层,这就是分布式计算方式。
分布式计算的优势:采用分布式计算有着多方面的技术优势,把逻辑计算封装起来。当需要动态改变一个系统的逻辑计算规则时,只要改变一个应用服务器的程序即可,这样就无需中断用户。这种多级模式对于需经常、快速改变应用程序的行业很有帮助。
PowerBuilder支持分布式事务处理,而且PowerBuilder开发分布式应用十分简单,只要您会使用erBuilder中的用户自定义的不可视对象,您就会很快地掌握分布式PowerBuilder的开发。
在PowerBuilder中,应用服务器一端的功能都是通过不可视用户对象实现的,开发人员可以将PowerBuilder的自定义用户的对象放于应用服务器一侧,被称作远端对象,在客户端放置该用户对象的代理对象。此外,在服务器一侧有一个新的transport对象用于监听任何一个用户或其它应用服务器的请求,在客户端有一个connection 对象用以建立同远端对象的连接。客户端的应用程序通过connection对象连接应用服务器, 连接建立后,客户端的应用就可以象调用本地对象一样调用应用服务器上的对象函数了。
一个简单的分布式PowerBuilder应用举例
一、服务器端应用
首先您需要创建一个服务器端的应用。目前所有的分布式PowerBuilder服务器应用都应当运行在32位平台上(WindowsNT或Windows95)。
这个应用需有三个组成部分:
一、用户自定义的对象类;
二、这个对象类在服务器端的代理;
三、一个传输对象,这个传输对象并不被调用,它只是用以监听从网络上的客户一端的调用。
创建用户对象
我们首先定义一个服务器端的对象类,它的步骤如下:
1.点击用户对象图标。
2.点击new按钮。
3.在NewUserObject对话框中选择Class组中的Custom类型。
4.在进入用户对象的设计中,选择DeclareUserObjectfunction菜单项。
5.点击new按钮。
6.函数起名为"of-my-message"。
7.函数的返回值为string型,无参数传递。
8.在函数的Script中写入:Return"HelloWorld"
9.关闭函数画笔,将这一用户对象存储为uo-my-object"
设置代理对象
这个代理对象在客户端当作一个类被引用,但它首先应在服务器端创建,创建代理对象的步骤如下:
1.打开刚创建的用户对象uo-my-object。
2.在用户区点击鼠标右键。
3.在弹出菜单中选择"setproxyname"。
4.在代理名称的输入域输入"uo-proxy-my-object",点击OK按钮。
5.存储"uo-my-object"对象。
这时如果您在Library画笔中看当前的PBL库,您将看到新创建的代理对象。
设置传输对象
这个对象的工作方式与PowerBuilder中的事务对象(transaction)很相似,它是同客户端建立连接的结构。设置过程如下:
1.声明一个全局的transport变量。
如: transportgt-transport
2.在application的Open事件中写下:
gt-transport=Create transport
gt-transport.driver="namedpipes"
gt-transport.location="."
gt-transport.application="my-dpbserv"
gt-transport.options="" gt-transport.Listen()
二、客户端的应用
在客户端的应用有四个组成部分:
一、得到在Server端创建的代理对象,将其放入客户端的对象库中;
二、连接服务器端的应用,这一步骤即是创建一个连接对象(connect)的实例;
三、创建代理对象,设置它的连接(用SetConnec-tions()连接到Connect对象上);
四、调用远过程对象,测试这一连接。
将代理对象放入客户端的对象库中,这里您有以下两种方法实现:
一是拷贝"uo-proxy-my-object"这一代理对象到客户端的应用对象库中;
另一个办法是将服务器端"uo-proxy-my-object"这个对象所在的对象库也放入客户端的搜索库中。
将客户端连接在服务器应用上:
1.声明一个全局连接对象: connectiongc-connection
2.在应用的Open事件中创建连接对象,定义其部分属性并建立同服务器的连接:
gc-connection=Createconnection
gc-connection.driver="namedpipes"
gc-connection.location="SERVERNAME"
gc-connection.application="my-dpbserv"
gc-connection.options=""
gc-connection.ConnectToServer()
其中location属性是指服务器应用运行所在的那个计算机的名字:
application属性是传输对象所在的服务器端应用的名字。
创建代理对象实例,将其连到连接对象上。
1.声明一个"uo-proxy-my-object"的全局变量。(这也正是要将这一代理对象置于客户端应用所搜索到的路径中的原因)
uo-proxy-my-object gp-uo-proxy-my-object
2.在应用对象的Open事件中键入下列代码:
gp-uo-proxy-my-object=Createuo-proxy-my-object
3.调用代理对象的SetConnect()函数传递连接对象的参数,将代理对象实例连到连接对象上:
(这一端代码也可在应用的Open事件中执行)
gp-uo-proxy-my-object.SetConnect(gc-connection)
调用远端对象:
远端对象的of-my-message函数返回一个字符串,所以我们可以在下列程序中调用这一函数,将其返回值显示出来。
1.在窗口中,设计一个按钮,它的clicked事件如下编写:
stringls-retcode
ls-retcode=iuo-proxy-my-object.of-my-message()
MessageBox("MessageFromRemoteObject",ls-retcode)
2.首先在服务器端运行服务器端的应用;
3.在客户机上运行客户端的应用;
4.点击窗口按钮,我们即可得到结果,显示出一个标有"helloWorld"的消息框。