构件与中间件技术(实验一)

分布式通话记录查询

实验原理

一、实验框架(三层结构):
在这里插入图片描述
在这里插入图片描述
二、实验原理:
由于整个实验是一个跨机器操作查询,所以采用三层结构(数据层、中间层、客户层以及JDBC:ODBC、Java RMI(java方法远程调用))的构件,不是像平时编程那样进行的本地运行,此处要采用中间件来构件跨机器的互操作过程。
首先根据三层互操作框架,我们知道应该先建立数据层,以此得到数据的存储、以及之后数据的使用,如下图。可以看出来,整个数据层存储了两个重要信息——“电话号码、历史记录”。
在这里插入图片描述
建立好了数据库(数据层),我们就可以通过查询数据库的形式得到数据库中的数据,以下提供SQL编程的查询过程,仅供参考。因为聪明的你,有比我更好的实现方式。

#查询QueryCallHistoryWithSubscriber
SELECT TelephoneDirectory.number, CallHistory.startTime, CallHistory.endTime FROM TelephoneDirectory, CallHistory WHERE (TelephoneDirectory.number = CallHistory.number) AND (TelephoneDirectory.subscriber = [Telephone Subscriber]) ORDER BY  startTime; 

既然我们都已经能对数据层进行查询了,那么我们如何实现跨平台的分布式查询呢?也就要我们学到的构件与中间件技术了,在思考深一点,我们又如何利用我们学到的构件与中间件技术来实现这一个过程呢?请保持的好奇,我们接着往下看。
首先我们来了解一个概念(伺服对象:使用Java RMI实现分布式对象时,需要开发人员编写一个服务程序,该服务程序完成真正提供服务的分布式对象的创建与注册,服务程序中的真正提供服务的对象实例通常又称为伺服对象( servant )
根据我们之前说到的框架,我们需要在客户端与数据层之间构件一种类似于通道的中间件,实现对数据层的查询,并将数据传入客户端,所以整个中间层的构建核心功能就是如何具体的查询数据库。在面向对象中我们学到,对象封装具有保护数据信息的能力,所以我们提出了伺服对象这一概念,该对象充分具备了如何查询数据,如何构建对象、注销对象等功能,从而建立起我们需要的中间层。
在这里插入图片描述
最后就是客户层,通过中间层提供的伺服对象提供的功能,我们可实现对数据层的访问。

三、实验实现:
其实相对于数据层与客户层的实现,是相对于比较简单的,最重要的还是中间层的实现。这里侧重于构件与中间件技术,重点说中间层。
1、实现——定义分布式对象接口
根据整个实现框架,我们采用Java RMI(java方法远程调用),利用Java语言的interface接口技术来定义分布式对象接口。那思考一下,为什么我们需要定义这样一个接口呢?

package Telephone; 
public interface CallManagerInterface extends java.rmi.Remote { 
// 根据电话用户名字查询通话记录。 
// 参数: subscriber - 电话用户的名字 
public Database.DatabaseTableModel getCallHistory
                        (String subscriber) 
         throws java.rmi.RemoteException; }

没错,就是为了给客户层提供功能并实现它,以此达到对数据层的数据查询。所以接下来我们就是要去实现这个接口,那么如何去实现这个接口呢?如下图。中间部分的实现代码就留给各位去完成,实现不一。

public class CallManager
		 extends java.rmi.server.UnicastRemoteObject 
		 implements CallManagerInterface 
{ 
	public synchronized 
		Database.DatabaseTableModel getCallHistory 
								(String subscriber) 
		 throws java.rmi.RemoteException 
		 { 
		 //根据用户名查询通话记录,返回通话记录
		  } 
}

接口实现完成之后,便是需要利用该对象去进行实例化,从而真正的对整个数据层进行访问,查询我们需要的数据。创建并注册分布式对象实例代码如下:

public class ServerApplication 
{
	 public static void main(string args[]){ 
	 	try {
	 		 Telephone.CallManager callManager = new Telephone.CallManager();
	 		  java.rmi.Naming.rebind ("CallManagerServant001", callManager); 
	 		 } catch(java.rmi.RemoteException exc) { 
	 		 } 
	 		 System.out.println( "Call manager in the server is ready ...");
	 	 }
}

整个中间层实现完成,之后便是客户端程序(也就是主函数):
由于跨平台运行,所以需要根据主机名与对象标识解析远程对象,同时要根据接口定义调用服务。
代码如下:

public class Client{ 
	public static void main(string args[]){
	 … 
	 String host = "//localhost/"; 
	 String objectId = "CallManagerServant001"; 
	 CallManagerInterface callManager =
	 (CallManagerInterface)java.rmi.Naming.lookup (host + objectId); 
	 result = callManager.getCallHistory(subscriber); 
	 result.printData();}

此处给出整个程序的文件清单,文章最底部给出整个程序,需要验证者,自行下载查看。
在这里插入图片描述
编程程序过程:
在这里插入图片描述
最后生成客户端桩与服务端框架,如图:
在这里插入图片描述
编译文件如下:
在这里插入图片描述
操作完整个流程,之后便建立起了客户端与数据层的框架,这时就可以启动整个程序,查询数据层的数据。
在这里插入图片描述
然后我们便实现了一个分布式通话记录查询的程序。如何验证不同客户端的访问呢?更改该代码中的host,从而达到不同客户端对数据层的访问,整个实验便完成了。

public class Client{
	 public static void main(string args[]){
	  … 
	  String host = "//serverhost/"; 
	  String objectId = "CallManagerServant001"; 
	  CallManagerInterface callManager = 			
	     (CallManagerInterface)
	     java.rmi.Naming.lookup (host + objectId); result = 
	     callManager.getCallHistory(subscriber); 
	     result.printData();}

此处附下完整程序:
百度网盘:程序文件
提取码:iuwu
原文链接:构件与中间件技术(实验一)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值