分布式PowerBuilder设计
张健姿
01-6-22 下午 03:09:10
1996年6月推出的Power-Builder 5.0,增加了许多新特性,其中较为引人注目的是分布式PowerBuilder的计算方式(Distributing PowerBuilder)。
所谓分布式计算方式和三级系统结构,是近年来提出的一种新的计算方式,这就是在传统的客户机/服务器两级结构中再增加一个称作应用服务器的中间级,用以执行复杂的商业逻辑计算。传统的两级结构中商业逻辑一般是放在客户端,少量的则以存储过程的形式放在数据库服务器中。将商业逻辑从其他两级中独立出来,将更适应于日益复杂化和日益变化的商业逻辑的需要,从而带来了开发、维护和使用时的便利。虽然三级结构在传统的数据库领域还没有被人们广泛接受,但在Internet&Intranet领域,人们已开始大量使用这种分布式的计算方式了:在Intranet中,系统至少就是由浏览器(客户机)、Web服务器(应用服务器)、数据库这样的三级结构组成。而PowerBuilder支持这种分布式的计算方式,这使得我们使用PowerBuilder开发Internet应用成为了可能。
所谓分布式PowerBuilder的实现就是在客户端远程地初始化一个在服务器端的用户自定义对象,并且调用这一对象的属性和函数。
分布式PowerBuilder中的新概念
服务器应用:在以往的PowerBuilder版本中,Power-Builder应用是作为客户机/服务器体系结构中的客户端应用提交的,在分布式PowerBuilder中引入了服务器应用这个概念。这个应用包括了不可视的用户对象,并被客户端应用调用,这些用户对象被称作远过程对象。这种调用可以是跨进程或跨硬件平台的。分布式PowerBuilder在服务器端有一个PowerScript对象Transport来监听客户端对过程调用的需求,而这个服务器端的应用也可以同一般传统的客户机/服务器应用的客户端或远程的客户端应用一样来调用另外的PowerBuilder服务器应用。
客户应用:PowerBuilder客户应用是用以调用远端对象的部分。分布式PowerBuilder应用包括了一个新的对象,称作Connection,用以连接PowerBuilder服务器应用。当同服务器建立连接后,客户应用将像调用本地的不可视用户对象一样调用远程对象。
远程对象:与其他的不可视用户对象类同。一个远程对象包含了用PowerScript编写的商业逻辑,放在服务器端,作为不可视用户对象的特例,远程对象可以引用各种不可视的函数和数据库的指令,如使用DataWindow的不可视形式DataStore来实现对数据库访问的封装等。远程对象像是一个过程或函数的调用,并支持参数传递和返回结果,支持除对象数据类型以外的其他所有类型。
传输对象:是服务器端用以接收客户请求的特殊连接对象。当使用create transport命令创建一个传输实例后,该对象以对象的属性中所定义的协议监听接收客户的请求。这个对象的属性包括通讯驱动名称、通讯协议类型、超时协议等,得到和设定这些属性的方法同PowerBuilder的其他对象如transaction等一样。
连接对象:是客户端发送请求的客户端的对象。当使用create transport创建一个连接对象时,本对象的Connect To Server函数执行同服务器的连接,通讯方式如通讯名称、协议等由连接对象的属性来决定。
对象存储代理:一种存储用户对象的新选择。存储代理保存对象的远程名称并生成内部代码以供远程调用。当connec-tion对象与之建立连接后,该对象就能够用以远程调用。
新的PowerBuilder对象是nonvisualobject和structure的继承类,它们的关系如下:
nonvisualobject
connectobject(新)
connection(新)
transport(新)
remoteobject(新)
structure
connectioninfo(新)
设计一个分布式PowerBuilder应用举例
一、服务器端应用
首先您需要创建一个服务器端的应用。目前所有的分布式PowerBuilder服务器应用都应当运行在32位平台上(Windows NT或Windows 95)。这个应用需有三个组成部分:一、用户自定义的对象类;二、这个对象类在服务器端的代理;三、一个传输对象,这个传输对象并不被调用,它只是用以监听从网络上的客户一端的调用。
·创建用户对象
我们首先定义一个服务器端的对象类,它的步骤如下:
1.点击用户对象图标。
2.点击new按钮。
3.在NewUserObject对话框中选择Class组中的Custom类型。
4.在进入用户对象的设计中,选择Declare|User Object function菜单项。
5.点击new按钮。
6.函数起名为"of-my-message"。
7.函数的返回值为string型,无参数传递。
8.在函数的Script中写入:Return "Hello World"
9.关闭函数画笔,将这一用户对象存储为uo-my-object"
·设置代理对象
这个代理对象在客户端当作一个类被引用,但它首先应在服务器端创建,创建代理对象的步骤如下:
1.打开刚创建的用户对象uo-my-object。
2.在用户区点击鼠标右键。
3.在弹出菜单中选择"set proxy name"。
4.在代理名称的输入域输入"uo-proxy-my-object",点击OK按钮。
5.存储"uo-my-object"对象。
*这时如果您在Library画笔中看当前的PBL库,您将看到新创建的代理对象。
·设置传输对象
这个对象的工作方式与PowerBuilder中的事务对象(transaction)很相似,它是同客户端建立连接的结构。设置过程如下:
1.声明一个全局的transport变量。如:
transport gt-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.声明一个全局连接对象:
connection gc-connection 2.在应用的Open事件中创建连接对象,定义其部分属性并建立同服务器的连接:
gc-connection=Create connection
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=Create uo-proxy-my-object 3.调用代理对象的SetConnect()函数传递连接对象的参数,将代理对象实例连到连接对象上:(这一端代码也可在应用的Open事件中执行)
gp-uo-proxy-my-object.SetConnect(gc-connection)
·调用远端对象
远端对象的of-my-message函数返回一个字符串,所以我们可以在下列程序中调用这一函数,将其返回值显示出来。 1.在窗口中,设计一个按钮,它的clicked事件如下编写:
string ls-retcode
ls-retcode=iuo-proxy-my-object.of-my-message()
MessageBox("Message From Remote Object",ls-retcode) 2.首先在服务器端运行服务器端的应用; 3.在客户上运行客户端的应用; 4.点击窗口按钮,我们即可得到结果,显示出一个标有"hello World"的消息框。