第一步我们需要先启动RMI服务端,并注册服务。
RMI服务端注册服务代码:
package com.anbai.sec.rmi;import java.rmi.Naming;import java.rmi.registry.LocateRegistry;public class RMIServerTest {// RMI服务器IP地址public static final String RMI_HOST = "127.0.0.1";// RMI服务端口public static final int RMI_PORT = 9527;// RMI服务名称public static final String RMI_NAME = "rmi://" + RMI_HOST + ":" + RMI_PORT + "/test";public static void main(String[] args) {try {// 注册RMI端口LocateRegistry.createRegistry(RMI_PORT);// 绑定Remote对象Naming.bind(RMI_NAME, new RMITestImpl());System.out.println("RMI服务启动成功,服务地址:" + RMI_NAME);} catch (Exception e) {e.printStackTrace();}}}
程序运行结果:
RMI服务启动成功,服务地址:rmi://127.0.0.1:9527/test
Naming.bind(RMI_NAME, new RMITestImpl())绑定的是服务端的一个类实例,RMI客户端需要有这个实例的接口代码(RMITestInterface.java),RMI客户端调用服务器端的RMI服务时会返回这个服务所绑定的对象引用,RMI客户端可以通过该引用对象调用远程的服务实现类的方法并获取方法执行结果。
RMITestInterface示例代码:
package com.anbai.sec.rmi;import java.rmi.Remote;import java.rmi.RemoteException;/*** RMI测试接口*/public interface RMITestInterface extends Remote {/*** RMI测试方法** @return 返回测试字符串*/String test() throws RemoteException;}
这个区别于普通的接口调用,这个接口在RMI客户端中没有实现代码,接口的实现代码在RMI服务端。
服务端RMITestInterface实现代码示例代码:
**
package com.anbai.sec.rmi;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class RMITestImpl extends UnicastRemoteObject implements RMITestInterface {private static final long serialVersionUID = 1L;protected RMITestImpl() throws RemoteException {super();}/*** RMI测试方法** @return 返回测试字符串*/@Overridepublic String test() throws RemoteException {return "Hello RMI~";}}
RMI客户端示例代码:
package com.anbai.sec.rmi;import java.rmi.Naming;import static com.anbai.sec.rmi.RMIServerTest.RMI_NAME;public class RMIClientTest {public static void main(String[] args) {try {// 查找远程RMI服务RMITestInterface rt = (RMITestInterface) Naming.lookup(RMI_NAME);// 调用远程接口RMITestInterface类的test方法String result = rt.test();// 输出RMI方法调用结果System.out.println(result);} catch (Exception e) {e.printStackTrace();}}}
程序运行结果:
Hello RMI~
