RMI->remote method invoke 也就是远程方法调用
第一种 也是比较简单的方法 利用 UnicastRemoteObject
首先需要定义一个extents Remote 的接口 里面只有一个方法 测试用
public interface HelloRemoteInterface extends Remote { public void hello() throws RemoteException; }
下面要一个实现类 实现我们自己定义有RMI功能的接口 这个类不仅要实现接口 而且需要继承自UnicastRemoteObject
public class HelloRemoteIMPL extends UnicastRemoteObject implements HelloRemoteInterface { protected HelloRemoteIMPL() throws RemoteException { super(); } @Override public void hello() throws RemoteException { System.out.println("test RMI"); } }
下面就需要模拟一个server端和client端 首先是server端
public class RMIServer { public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { HelloRemoteIMPL h = new HelloRemoteIMPL(); Registry reg = LocateRegistry.createRegistry(8888); Naming.bind("rmi://localhost:8888/yang",h); } }
LocateRegistry.createRegistry(8888);
这一步是声明服务器RMI所使用的端口 也是必须的 默认值好像是1099
Naming.bind("rmi://localhost:8888/yang",h);
绑定HelloRemoteIMPL 到服务器上
第一个参数为一个string型 有一个规范为 rmi + url + name 其中 rmi可以省略 也就是 rmi://localhost:8888/yang 等同于 //localhost:8888/yang
下面是client端 很简单
public class RMIClient { public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { HelloRemoteInterface h = (HelloRemoteInterface) Naming.lookup("rmi://localhost:8888/yang"); h.hello(); } }
但注意 这里调用时 只能转型为实现Remote的接口HelloRemoteInterface 而不能转化为实现了我们自己接口的类 HelloRemoteIMPL
第二种 利用UnicastRemoteObject.exportObject() 代码稍多些
跟上面的套路差不多少 只不过我们的接口实现类HelloRemoteIMPL 不再需要继承 UnicastRemoteObject 改成
public class HelloRemoteIMPL implements HelloRemoteInterface { @Override public void hello() throws RemoteException { System.out.println("test RMI"); } }
server端 其中bind的规范和上面一样 如果是在本机 可以简写
public class RMIServer { public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException { HelloRemoteIMPL h = new HelloRemoteIMPL(); Registry reg = LocateRegistry.createRegistry(8888); reg.bind("love", h); UnicastRemoteObject.exportObject(h); } }
client端
public class RMIClient { public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { Registry reg=LocateRegistry.getRegistry("125.211.81.24",8888); HelloRemoteInterface h = (HelloRemoteInterface) reg.lookup("love"); h.hello(); } }
稍微麻烦一点的就是我们的HelloRemoteIMPL 类需要一个又系统生成的HelloRemoteIMPL_Stub 类
方法为 cmd -> 到HelloRemoteIMPL 路径下 先javac编译HelloRemoteIMPL.java 然后
rmic HelloRemoteIMPL
就可以产生出HelloRemoteIMPL
对应的 HelloRemoteIMPL_Stub
类
如果没有_Stub类的话会抛出 java.rmi.StubNotFoundException