选择显示字体大小

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

崔滋恩


作为整个产品供应链中的一部分,现代企业的企业信息资源广泛分布在各种网络体系中,企业必须能够处理这些分布的信息资源,这使得分布式企业应用成为构建企业信息环境的必然需求。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:prompt>rmic 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 是要下载的文件所在的机器(也是服务端所在的机器)。如果全部通过的话,当客户端运行后,则这个文件将被下载到本地。






 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons