因为是Java内置的功能,所以不需要引入任何额外的Jar包
首先我们定义一个接口,这个接口必须继承Remote
package cn.blueboz.rmi; import java.rmi.Remote; import java.rmi.RemoteException; /** * Created by Administrator on 2016/4/20. * 定义一个远程接口,这个远程接口务必实现Remote接口 */ public interface IHelloRMI extends Remote { /** * 一个最简单的Hello实例 */ public String sayHelloToClient()throws RemoteException; }
接下来就是实现这个接口,注意,这个必须继承UnicastRemoteObject这个类
package cn.blueboz.rmi.impl; import cn.blueboz.rmi.IHelloRMI; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * Created by Administrator on 2016/4/20. */ public class HelloRMIImpl extends UnicastRemoteObject implements IHelloRMI{ /*i * 这里必须是构造器抛出RemoteException * 因为继承父类UnicastRemoteObject构造器中抛出RemoteException * 同时这个类是必须继承UnicastRemoteObject这个类 */ public HelloRMIImpl()throws RemoteException{ } @Override public String sayHelloToClient()throws RemoteException { return "你好客户端,我是服务端"; } }接下来就是发布接口了
package cn.blueboz.rmi; import cn.blueboz.rmi.impl.HelloRMIImpl; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; /** * Created by Administrator on 2016/4/20. */ public class RMIServer { /** * 发布接口 * @param args */ public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException { /** * 创建一个远程接口的实现类 */ IHelloRMI helloRMI=new HelloRMIImpl(); /** * 创建一个RMI端口,如果没有创建,RMI服务也就无法绑定到这个接口上面 */ System.out.println("正在创建接口"); LocateRegistry.createRegistry(8889); System.out.println("创建端口成功"); /** * 在这里声明一下三个异常 * RemoteException:创建远程对象异常 * AlreadyBoundException:重复绑定异常 * MalformedURLException:指定的URI发生错误的异常 */ System.out.println("正在绑定"); Naming.bind("rmi://localhost:8889/HelloRMI",helloRMI); System.out.println("绑定成功!"); //注意,何以省略掉协议前缀,即使rmi: //Naming.bind("//localhost:8889/HelloRMI",helloRMI); } }最后,我们可以看到
就说明我们的接口发布成功了,也可以使用终端内置工具netstat查看端口占用情况,发现存在8889端口,表示我们的端口发布成功
接下来就是测试我们的端口
新建另外的一个工程,从服务端赋值过来远程接口IHelloRemote,并且保持包路径不变
package cn.blueboz.rmiclient; import cn.blueboz.rmi.IHelloRMI; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * Created by Administrator on 2016/4/20. * Java RMI客户端 */ public class RMIClient { public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException { /** * IHelloRMI接口从服务端拷贝过来即可 * 这里必须注意的是IHelloRMI的包路径必须与服务端一致 * 如果不一致,会发生ClassNotFoundException * Naming.lookup是在指定地址插在rmi服务 */ IHelloRMI helloRMI = (IHelloRMI) Naming.lookup("rmi://localhost:8889/HelloRMI"); String s = helloRMI.sayHelloToClient(); System.out.println(s); } }下面是测试结果
到这里JavaRMI的HelloWorld程序已经完成。