六步教你学会简单 RMI 江苏 无锡 缪小东 (以下所有 java 文件、 .class 文件和 policy.txt 文件都在 c 盘根目录哦! 101.txt 在 c 盘的子目录 11 下哦!一定要放对!!!) 一、 定义远程接口 远程接口就是远程" name="description" />
江苏 无锡 缪小东
(以下所有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.txt
grant{
permission java.security.AllPermission "" , "" ;
};
这个都会吧!要么你就一个一个编译好了!
注意哦,不是FileServerImpl.class哦!看看下面的错误:
当成你要使用rmic命令编译一个FileServerImpl的内部类class哦!($代表什么,请阅读《Think in java》)
使用rmiregistry的命令窗口,启动一个rmiregistry,本窗口“阻塞”(不太精确哦,就是不能输入其它命令)。
VBrPAvgo9aX8W7rOB6pTZwdraw" target=_blank>
使用start rmiregistry命令,本窗口出现“提示符”,可以继续输入命令,且跳出一个窗口,也是“阻塞”的哦。表示正在工作,方法没有返回而已。
注意该窗口的标题了没有!其中奥妙,慢慢体会!
(使用此命令时policy.txt文件必须和FileServer.class在同一目录(本例c盘根目录)中哦!)
(使用此命令时101.txt必须位于c盘下11目录下哦,要不然没有下面的结果哦!)
看看你的c盘根目录,是不是多了一个101.txt啊,是不是和你放在11目录下的101.txt一样啊!
成了,到此结束!――六步学会简单RMI。是否很有成就感啊!
(简单地把此代码拷贝过去,按照上面的顺序做就行了!立刻行动吧!)
不过以上程序尽管是一个RMI的网络程序,是否太简单了!Java手册中不是说可以传递java对象吗?要是真的能传递对象那就很强大啦!好像有些细节还不是很明白吧!
请看下一篇!满足你以上的需求!下篇给你讲述各个接口和类的含义,以及RMI程序符合发布(哪些类位于客户端,哪些类位于服务器端)等等!