服务端经过rmi将对象注册到远程服务, 客户端使用时, 只须要经过rmi协议获取便可, 只要接口统一, 便可不须要知道内部具体实现, 直接调用使用.java
这里就是客户端和服务端统一的接口, 只须要服务端根据这个接口实现相应的功能, 而后注册上去, 客户端就能够根据这个接口来使用相应的功能.app
import java.rmi.RemoteException; import java.rmi.*; /** * 定义一个远程接口,必须继承Remote接口,其中须要远程调用的方法须抛出RemoteException异常 */ public interface CompareHelper<T> extends Remote { /** * 比较 object1 和 object2 的大小, * 若是object1大, 那么返回true * 若是object2大, 那么返回false */ boolean compare(T object1, T object2) throws RemoteException; /** * 将object2的值链接到object1的后面 */ T append(T object1, T object2) throws RemoteException; }
CompareHellper接口的其中一种实现. 用于处理Integer类型.ide
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class IntegerCompareHelper extends UnicastRemoteObject implements CompareHelper<Integer> { protected IntegerCompareHelper() throws RemoteException { } @Override public boolean compare(Integer object1, Integer object2) throws RemoteException { return object1 - object2 > 0; } @Override public Integer append(Integer object1, Integer object2) throws RemoteException { return Integer.valueOf(object1.toString() + object2.toString()); } }
CompareHellper接口的其中一种实现. 用于处理String类型.测试
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class StringCompareHelper extends UnicastRemoteObject implements CompareHelper<String> { protected StringCompareHelper() throws RemoteException { } @Override public boolean compare(String object1, String object2) throws RemoteException { return object1.compareTo(object2) > 0; } @Override public String append(String object1, String object2) throws RemoteException { return object1 + object2; } }
用于注册服务到远程服务上..net
import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; /** * 建立RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 */ public class Server { private static final String HOST = "localhost"; private static final int PORT = 9090; public static void main(String args[]) { try { //建立2个对象, 准备将这个两个对象做为远程对象注册 CompareHelper stringCompareHelper = new StringCompareHelper(); CompareHelper integerCompareHelper = new IntegerCompareHelper(); LocateRegistry.createRegistry(PORT); //绑定的URL标准格式为:rmi://host:port/name(其中协议名能够省略,下面两种写法都是正确的) // 本例子中就是 "rmi://localhost:9090/XXXXXXCompareHelper" Naming.bind("rmi://" + HOST + ":" + PORT + "/StringCompareHelper", stringCompareHelper); Naming.bind("//" + HOST + ":" + PORT + "/IntegerCompareHelper", integerCompareHelper); System.out.println("---->远程对象绑定成功!"); } catch (RemoteException e) { System.out.println("建立远程对象发生异常!"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("发生重复绑定对象异常!"); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("发生URL畸形异常!"); e.printStackTrace(); } } }
用于调用远程服务.代理
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 */ @SuppressWarnings("unchecked") public class Client { public static void main(String args[]) { try { CompareHelper compareHelper; compareHelper = (CompareHelper) Naming.lookup("rmi://localhost:9090/StringCompareHelper"); System.out.println(compareHelper.append("你好", "哈哈哈")); System.out.println(compareHelper.compare("abc", "ioi")); compareHelper = (CompareHelper) Naming.lookup("rmi://localhost:9090/IntegerCompareHelper"); System.out.println(compareHelper.append(6379, 8080)); System.out.println(compareHelper.compare(435, 666)); } catch (NotBoundException | MalformedURLException | RemoteException e) { e.printStackTrace(); } } }
先运行Server.java里的main方法来注册服务, 再运行Client.java里的main方法来进行相应服务的获取和调用.orm