Java远程方法调用(Java Remote Method Invocation,简称RMI)是实现RPC的一种机制。Java RMI实现过程可分为以下几个步骤:
1. 创建远程接口及声明远程方法;
2. 创建远程对象及实现远程方法;
3. 服务器端启动RMI注册服务,注册远程对象;
4. 客户端查找远程对象并调用远程方法。
远程接口具有如下特点:
1. 远程接口必须为public属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。
2. 远程接口必须扩展接口java.rmi.Remote。
3. 除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的throws从句中 声明java.rmi.RemoteException。(或 RemoteException 的父类)。
4. 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远 程接口,而不应声明为实施类。
5. 参数或返回值若为对象,该对象必须实行序列号接口 Serializable
其代码如下:
1) 创建远程接口及声明远程方法
package com.server;
import java.rmi.Remote; import java.rmi.RemoteException; public interface RmiSample extends Remote{ public int sum(int a, int b) throws RemoteException; public void save(Student s) throws RemoteException; public Student get() throws RemoteException; }
2) 创建远程对象及实现远程接口方法
package com.server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class RmiSampleImpl extends UnicastRemoteObject implements RmiSample{ /** * */ private static final long serialVersionUID = -7851182277085789517L; protected RmiSampleImpl() throws RemoteException { super(); } @Override public int sum(int a, int b) throws RemoteException { return a + b; } @Override public void save(Student s) throws RemoteException { System.out.println("student id is :"+s.getId()); System.out.println("student name is :"+s.getName()); } @Override public Student get() throws RemoteException { Student s = new Student(); s.setId(2); s.setName("学生2"); return s; } }
3)
服务器端启动RMI注册服务,将远程对象进行注册
package com.server; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class RmiSampleServer { public static void main(String[] args) { try{ LocateRegistry.createRegistry(8808); //LocateRegistry.createRegistry(1099); RmiSampleImpl server= new RmiSampleImpl(); Naming.rebind("//localhost:8808/SAMPLE-SERVER" , server); //Naming.rebind("server" , server); }catch (MalformedURLException me){ System.out.println("Malformed URL: " + me.toString()); }catch(RemoteException re){ System.out.println("Remote Exception: "+re.toString()); } } }
4)
客户端查找远程对象并调用远程方法
package com.client; import java.rmi.RemoteException; import java.rmi.Naming; import com.server.RmiSample; import com.server.Student; public class RmiSampleClient { public static void main(String[] args) { try { String url = "//localhost:8808/SAMPLE-SERVER"; //RmiSample RmiObject = (RmiSample) Naming.lookup("server"); RmiSample RmiObject = (RmiSample) Naming.lookup(url); System.out.println(" 3 + 2 = " + RmiObject.sum(3, 2)); Student s = new Student(); s.setId(1); s.setName("学生1"); RmiObject.save(s); Student student = RmiObject.get(); System.out.println("student id is :"+student.getId()); System.out.println("student name is :"+student.getName()); } catch (RemoteException rex) { System.out.println("Error in lookup: " + rex.toString()); } catch (java.net.MalformedURLException me) { System.out.println("Malformed URL: " + me.toString()); } catch (java.rmi.NotBoundException ne) { System.out.println("NotBound: " + ne.toString()); } } }