1、示例
三个角色:RMIService、RMIServer、RMIClient。(RMIServer向RMIService注册Stub、RMIService在RMIClient lookup时向其提供Stub)
服务端编写完后,把服务端的功能接口类给客户端,客户端编写自己的代码即可。(客户端通过向RMI Service查找指定的服务得到Stub,不用手动生成任何Stub)
代码:
server:
接口定义及实现:
1 /** 2 * <br> 3 * 在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象, 供客户端访问并提供一定的服务。JavaDoc描述:Remote 接口用于标识其方法可以从非本地虚拟机上 调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口” (扩展 java.rmi.Remote 的接口)中指定的这些方法才可被远程调用。 4 */ 5 public interface Hello extends Remote { 6 /* 7 * extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常, 则表明该方法可被客户端远程访问调用。 8 */ 9 public String sayHello(String name) throws RemoteException; 10 } 11 12 /** 13 * 远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时, 该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”, 而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信, 14 * 而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。 15 */ 16 /* java.rmi.server.UnicastRemoteObject构造函数中将生成stub和skeleton */ 17 public class HelloImpl extends UnicastRemoteObject implements Hello { 18 private static final long serialVersionUID = -271947229644133464L; 19 20 // 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常 21 public HelloImpl() throws RemoteException { 22 super(); 23 } 24 25 @Override 26 public String sayHello(String name) throws RemoteException { 27 // TODO Auto-generated method stub 28 return "hello " + name; 29 } 30 }