Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
1、接口定义
package com.lxp.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface IHello extends Remote{ public String HelloWorld() throws RemoteException; public String sayHelloToSomeBody(String name) throws RemoteException; }2、接口实现
package com.lxp.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; //必须继承UnicastRemoteObject public class HelloImpl extends UnicastRemoteObject implements IHello{ @Override public String HelloWorld() throws RemoteException { return "Hello World!"; } @Override public String sayHelloToSomeBody(String name) throws RemoteException { return "你好"+name; } public HelloImpl() throws RemoteException {} }3、服务器端实现
package com.lxp.rmi; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class HelloServer { public static void main(String[] args) { try { //创建一个远程对象 IHello rhello = new HelloImpl(); //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 LocateRegistry.createRegistry(8889); //把远程对象注册到RMI注册服务器上,并命名为RHello //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) Naming.bind("rmi://localhost:8889/RHello", rhello); // Naming.bind("//localhost:8888/RHello", rhello); System.out.println(">>>>>>>Info:远程IHello对象绑定成功!"); } 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(); } } }4、客户端实现
package com.lxp.rmi; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; public class HelloClient { public static void main(String[] args) { try { IHello rhello = (IHello)Naming.lookup("rmi://localhost:8889/RHello"); System.out.println(rhello.HelloWorld()); System.out.println(rhello.sayHelloToSomeBody("鸣人")); } catch(RemoteException e) { e.printStackTrace(); } catch(NotBoundException e) { e.printStackTrace(); } catch(MalformedURLException e) { e.printStackTrace(); } } }