分布式通话记录查询
实验原理
一、实验框架(三层结构):
二、实验原理:
由于整个实验是一个跨机器操作查询,所以采用三层结构(数据层、中间层、客户层以及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
原文链接:构件与中间件技术(实验一)