技术开发 频道

用RMI和CORBA进行分布式Java编程

开发服务器

第三个步骤是开发服务器。服务器需要做三件事:
 
创建RMISecurityManager的一个实例并安装它
创建远程对象(在本例中是FileImpl)的一个实例
在RMI注册表中登记这个创建的对象。实现的范例见代码范例3。

代码范例 3: 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 注册表在缺省的端口号1099上运行。但是,如果RMI注册表在其他端口号上运行, 就必须在这一句中指定端口号。例如,如果RMI注册表在端口4500上运行,那么这一句就变成:Naming.rebind("//127.0.0.1:4500/FileServer", fi)另外,在这里要着重指出,我们假定rmi注册表和服务器是在同一台电脑上运行。如果不是这样,只需修改rebind方法中的地址即可。
 
开发客户机
 
  下一步是开发客户机。客户机可以远程调用远程接口 (FileInterface)中指定的任何方法。但是为了能这么做,客户机首先必须从RMI注册表中获得指向该远程对象的引用。获得引用之后就可以调 用downloadFile方法了。客户机的实现请见代码范例4。在这个实 现中,客户机从命令行接收两个参数:
 
第一个参数是要下载文件的名称,第二个参数是要下载的文件所在主机的地址,也就是运行文件服务器的那台电脑的地址。
 
代码范例4: 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(); } } }
运行应用程序
 
  为了运行应用程序,我们需要生成存根和基干,编译服务器和客户机,启动 RMI注册表,最后是启动服务器和客户机。
 
  为了生成存根和基干,请使用rmic编译器:prompt> rmic FileImpl
 
  这将生成两个文件:FileImpl_Stub.class和 FileImpl_Skel.class。存根是一个客户机代理,基干是一个服 务器基干。
 
  下一步是编译服务器和客户机。用javac编译器来做这件事。但是请注意:如果服务器和客户机是在两台不同的机器上开发的,为了编译客户机,需要把接口 (FileInterface)复制一份。
 
  最后,启动RMI注册表并运行服务器和客户机。为了在缺省的端口号上启动 RMI注册表,请在Windows中使用命令rmireGIStry或 start rmiregistry。为了在其他端口号上启动RMI注册表,可以 提供该端口号作为RMI注册表的一个参数: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)和存根(FileImpl_Stub.class)。请使用以下命令启动客户机:prompt> java FileClient fileName machineName
 
  其中fileNamefileName是要下载的文件,machineName 是该文件所在的机器(运行文件服务器的那台机器)。如果一切顺利,那么客户机就存在了,下载完的文件保存在本地的机器上。

 

 

0
相关文章