分享
 
 
 

RMI在企业分布式计算中的应用

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

作为整个产品供应链中的一部分,现代企业的企业信息资源广泛分布在各种网络体系中,企业必须能够处理这些分布的信息资源,这使得分布式企业应用成为构建企业信息环境的必然需求。RMI是使用最广泛的分布式对象系统之一,本文举例介绍了分布式企业计算的基本模式及如何应用RMI 来开发分布式的企业应用。

一、客户/服务端模式

客户/服务模式通过使用一个应用程序(客户)和另一个程序(服务端)交换数据。在客户/服务模式的应用中,通常使用低层次的Socket来开发,使用Socket来开发客户/服务端模式意味着我们必须自己设计一种包含客户端和服务端都统一的命令集的协议,使得客户端和服务端能够通过这个协议来通信。

二、分布式对象模式

分布式对象系统是一个对象集合,通过定义很完善的统一接口来分隔开请求服务(客户端)和功能服务(服务端)。在分布式对象模式里,客户端发送一个消息到一个对象,由对象解释这个消息,然后决定应该由什么服务来完成,这个服务、方法或选择可能是被一个对象或是被一个Broker来完成的。

三、RMI

RMI是一个分布式对象模式。由于不需要设计协议使得使用RMI开发分布式程序比使用socket更加容易。在RMI里,设计者就象在调用一个本地类的方法一样,而实际上是在调用的时候相应的参数被发送到远端的对象后被解释,最后结果返回给调用者,下面本文通过开发一个文件交换程序来介绍RMI的应用。这个应用允许客户端从服务端交换(或下载)所有类型的文件。第一步是定义一个远程的接口,这个接口指定的签名方法将被服务端提供和被客户端调用。

1.定义一个远程接口

FileInterface.java代码如下:

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface FileInterface extends Remote {

public byte[] downloadFile(String fileName) throws

RemoteException;

}

接口FileInterface提供了一个downloadFile方法,然后返回一个相应的文件数据。

2.实现远程的接口

类FileImpl继承于UnicastRemoteObject类。这显示出FileImpl类是用来创建一个单独的、不能复制的、远程的对象,这个对象使用RMI默认的基于TCP的通信方式。FileImpl.java代码如下:

import java.io.*;

import java.rmi.*;

import java.rmi.server.UnicastRemoteObject;

public class FileImpl extends UnicastRemoteObject

implements FileInterface {

private String name;

public FileImpl(String s) throws RemoteException{

super();

name = s;

}

public byte[] downloadFile(String fileName){

try {

File file = new File(fileName);

byte buffer[] = new byte[(int)file.length()];

BufferedInputStream input = new

BufferedInputStream(new FileInputStream(fileName));

input.read(buffer,0,buffer.length);

input.close();

return(buffer);

} catch(Exception e){

System.out.println("FileImpl: "+e.getMessage());

e.printStackTrace();

return(null);

}}}

3.编写服务端

(1)创建并安装一个RMISecurityManager实例。

(2)创建一个远程对象的实例。

(3)使用RMI注册工具来注册这个对象。

FileServer.java 代码如下:

import java.io.*;

import java.rmi.*;

public class FileServer {

public static void main(String argv[]) {

if(System.getSecurityManager() == null) {

System.setSecurityManager(new RMISecurityManager());

}

try {

FileInterface fi = new FileImpl("FileServer");

Naming.rebind("//127.0.0.1/FileServer", fi);

} catch(Exception e) {

System.out.println("FileServer: "+e.getMessage());

e.printStackTrace();

}}}

声明Naming.rebind("//127.0.0.1/FileServer", fi) 中假定了RMI注册工具(RMI registry )使用并启动了1099端口。如果在其他端口运行了RMI注册工具,则必须在这个声明中定义。例如,如果RMI注册工具在4500端口运行,则声明应为:

Naming.rebind("//127.0.0.1:4500/FileServer", fi)

另外我们已经同时假定了我们的服务端和RMI注册工具是运行在同一台机器上的。否则需要修改rebind方法中的地址。

4.编写客户端

客户端可以远程调用远程接口(FileInterface)中的任何一个方法。无论如何实现,客户端必须先从RMI注册工具中获取一个远程对象的引用。当引用获得后,方法downloadFile被调用。在执行过程中,客户端从命令行中获得两个参数,第一个是要下载的文件名,第二个是要下载的机器的地址,在对应地址的机器上运行服务端。FileClient.java 代码如下:

import java.io.*;

import java.rmi.*;

public class FileClient{

public static void main(String argv[]) {

if(argv.length != 2) {

System.out.println("Usage: java FileClient fileName machineName");

System.exit(0);

}

try {

String name = "//" + argv[1] + "/FileServer";

FileInterface fi = (FileInterface) Naming.lookup(name);

byte[] filedata = fi.downloadFile(argv[0]);

File file = new File(argv[0]);

BufferedOutputStream output = new

BufferedOutputStream(new FileOutputStream(file.getName()));

output.write(filedata,0,filedata.length);

output.flush();

output.close();

} catch(Exception e) {

System.err.println("FileServer exception: "+ e.getMessage());

e.printStackTrace();

}}}

5.运行程序

为了运行程序,我们必须使用rmic来编译生成stubs和skeletons:promptrmic FileImpl。这将会生成FileImpl_Stub.class和FileImpl_Skel.class两个文件。stub是客户端的代理,而skeleton是服务端的框架。服务端和客户端采用javac来编译(如果服务端和客户端在两个不同的机器,则必须复制一个FileInterface接口)。

使用rmiregistry或者start rmiregistry 命令来运行RMI注册工具到window系统默认的端口上:

prompt rmiregistry portNumber

RMI注册工具运行之后,需要运行服务FileServer,因为RMI的安全机制将在服务端发生作用,所以必须增加一条安全策略:

grant {

permission java.security.AllPermission "", "";

};

为了运行服务端,需要有除客户类(FileClient.

class)之外所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。

prompt java -Djava.security.policy=policy.txt FileServer

为了在其他的机器运行客户端程序,需要一个远程接口(FileInterface.class)和一个stub(FileImpl_Stub.class)。 使用如下命令运行客户端:

prompt java FileClient fileName machineName

这里fileName是要下载的文件名,machineName 是要下载的文件所在的机器(也是服务端所在的机器)。如果全部通过的话,当客户端运行后,则这个文件将被下载到本地。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有