六步教你学会简单RMI
江苏 无锡 缪小东
(以下所有java文件、.class文件和policy.txt文件都在c盘根目录哦!101.txt在c盘的子目录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,本窗口“阻塞”(不太精确哦,就是不能输入其它命令)。


使用start rmiregistry命令,本窗口出现“提示符”,可以继续输入命令,且跳出一个窗口,也是“阻塞”的哦。表示正在工作,方法没有返回而已。
注意该窗口的标题了没有!其中奥妙,慢慢体会!
4. java –Djava.security.policy=policy.txt FileServer
或start java –Djava.security.policy=policy.txt FileServer
(使用此命令时policy.txt文件必须和FileServer.class在同一目录(本例c盘根目录)中哦!)
