六步教你学会简单 RMI 江苏 无锡 缪小东 (以下所有 java 文件、 .class 文件和 policy.txt 文件都在 c 盘根目录哦! 101.txt 在 c 盘的子目录 11 下哦!一定要放对!!!) 一、 定义远程接口 远程接口就是远程" name="description" />

六步教你学会简单RMI 上

发表于:2007-07-04来源:作者:点击数: 标签:
MI LY: 黑体; mso-ascii-font-family: Arial">六步教你学会简单 RMI 江苏 无锡 缪小东 (以下所有 java 文件、 .class 文件和 policy.txt 文件都在 c 盘根目录哦! 101.txt 在 c 盘的子目录 11 下哦!一定要放对!!!) 一、 定义远程接口 远程接口就是远程
 

MILY: 黑体; mso-ascii-font-family: Arial">六步教你学会简单RMI

江苏 无锡 缪小东

(以下所有java文件、.class文件和policy.txt文件都在c盘根目录哦!101.txtc盘的子目录11下哦!一定要放对!!!)

一、      定义远程接口

       远程接口就是远程机器上可供客户使用的方法的集合。很幸运它用java语言的接口表示!我们定义这样一个接口只有一个下载远程机器上的指定名称的文件。

//FileServerInterface.java

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface FileServerInterface extends Remote {

       public byte[] download(String Filename)throws RemoteException ;

}

 

二、实现远程接口

       实现上面远程接口的方法,同时继承UnicastRemoteObject类!

//FileServerImpl.java

import java.io.*;

import java.rmi.*;

import java.rmi.server.UnicastRemoteObject ;

 

public class FileServerImpl extends UnicastRemoteObject implements FileServerInterface{

       private static final String initDir = "c://11//";

       public     FileServerImpl( ) throws RemoteException{

              super();

       }

      

       public byte[] download(String filename){

              try{

                     File file = new File(initDir + filename);

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

                     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

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

                     bis.close();

                     return buffer ;

              }catch(Exception e ){

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

                     e.printStackTrace();

                     return null ;

              }

       }

      

}

 

三、编写服务器

1.         创建并安装一个RMISecurityManager实例;

2.         创建一个远程对象的实例;

3.         使用RMI注册工具注册该远程实例对象。

 

//FileServer.java

import java.io.*;

import java.rmi.*;

 

public class FileServer {

       public static void main(String[] args){

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

                     System.setSecurityManager(new RMISecurityManager());  

              }

              try{

                     FileServerImpl fi = new FileServerImpl("FileServer");

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

              }catch(Exception e){

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

                     e.printStackTrace();

              }            

       }

}

 

四、编写客户端

//FileClient.java

import java.io.*;

import java.rmi.*;

 

public class FileClient {

       public static void main(String[] args){

              if(args.length != 2 ){

                     System.out.println("Usage: java FileClient Filename machinename");

                     System.exit(0);

              }

              try{

                     String +args[1]+"/FileServer";

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

                     byte[] filedata = fi.download(args[0]);

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

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

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

                     bos.flush();

                     bos.close();                  

              }catch(Exception e){

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

                     e.printStackTrace();

              }

       }

}

 

五、创建一个policy文件

//policy.txt

grant{

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

};

 

六、运行程序

1. javac *.java

       这个都会吧!要么你就一个一个编译好了!

2. rmic FileServerImpl

 

       注意哦,不是FileServerImpl.class哦!看看下面的错误:

当成你要使用rmic命令编译一个FileServerImpl的内部类class哦!($代表什么,请阅读《Think in java》)

3. rmiregistry start rmiregistry

       使用rmiregistry的命令窗口,启动一个rmiregistry,本窗口“阻塞”(不太精确哦,就是不能输入其它命令)。

VBrPAvgo9aX8W7rOB6pTZwdraw" target=_blank>

       使用start rmiregistry命令,本窗口出现“提示符”,可以继续输入命令,且跳出一个窗口,也是“阻塞”的哦。表示正在工作,方法没有返回而已。

 

       注意该窗口的标题了没有!其中奥妙,慢慢体会!

 

4. java –Djava.security.policy=policy.txt FileServer

start java –Djava.security.policy=policy.txt FileServer

       使用此命令时policy.txt文件必须和FileServer.class在同一目录(本例c盘根目录)中哦!)

 

5. java FileClient 101.txt 127.0.0.1

start java FileClient 101.txt 127.0.0.1

       (使用此命令时101.txt必须位于c盘下11目录下哦,要不然没有下面的结果哦!)

       看看你的c盘根目录,是不是多了一个101.txt啊,是不是和你放在11目录下的101.txt一样啊!

       成了,到此结束!――六步学会简单RMI。是否很有成就感啊!

       (简单地把此代码拷贝过去,按照上面的顺序做就行了!立刻行动吧!)

       不过以上程序尽管是一个RMI网络程序,是否太简单了!Java手册中不是说可以传递java对象吗?要是真的能传递对象那就很强大啦!好像有些细节还不是很明白吧!

       请看下一篇!满足你以上的需求!下篇给你讲述各个接口和类的含义,以及RMI程序符合发布(哪些类位于客户端,哪些类位于服务器端)等等!     

 

 

更多精彩请到:
http://blog.163.com/miaoxiaodong78/

原文转自:http://www.ltesting.net