Java RMI是一种与具体网络无关, 轻量级的, 完全可移植的RPC.
这个例子是一个简单的调用, 返回一个当前时间.
RMI远程接口必须实现java.rmi.Remote
importjava.util.Date;publicinterfaceRemoteDateextendsjava.rmi.Remote{publicDate getRemoteDate()throwsjava.rmi.RemoteException;publicfinalstaticString LOOKUPNAME="RemoteDate";
}
继承了java.rmi.Remote接口,LOOKUPNAME是在RMI中注册和查找用的名字.
RemoteDate接口的实现类
importjava.io.Serializable;importjava.rmi.RemoteException;importjava.util.Date;publicclassRemoteDateImplimplementsRemoteDate, Serializable{privatestaticfinallongserialVersionUID=1L;
@OverridepublicDate getRemoteDate()throwsRemoteException {returnnewDate();
}
}
下面写两个类, 一个用于注册RMI, 另一个用来调用RemoteDate
DateClient用来调用远程RemoteDate的方法
importjava.rmi.Naming;importjava.util.Date;publicclassDateClient {protectedstaticRemoteDate netConn=null;publicstaticvoidmain(String[] args) {try{
netConn=(RemoteDate) Naming.lookup(RemoteDate.LOOKUPNAME);
Date today=netConn.getRemoteDate();
System.out.println(today.toString());
}catch(Exception e) {
e.printStackTrace();
}
}
}
DateServer用来注册RemoteDateImpl, 注册名为RemoteDate.LOOKUPNAME
importjava.net.MalformedURLException;importjava.rmi.Naming;importjava.rmi.RemoteException;publicclassDateServer {publicstaticvoidmain(String[] args) {try{
RemoteDateImpl im=newRemoteDateImpl();
System.out.println("DateServer starting...");
Naming.rebind(RemoteDate.LOOKUPNAME, im);
System.out.println("DateServer ready");
}catch(RemoteException e) {
e.printStackTrace();
}catch(MalformedURLException e) {
e.printStackTrace();
}
}
}
其他的准备工作:
在eclipse工程目录的bin目录下, 运行下列命令
>rmic -d . com.icejoywoo.first.RemoteDateImpl
>rmiregistry
(rmic和rmiregistry都是在jdk的bin下, 我这里假设你已经添加了环境变量path)
然后先运行DateServer的main函数
DateServer starting...
DateServer ready
再运行DateClient的main函数
Fri May0619:56:16CST2011
可以看到, 这个时间是当前的时间