RMI的概念html
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通信的一种通信机制。使用这种机制,某一台计算机上的对象能够调用另一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是创建分布式Java应用程序的方便途径。在过去,TCP/IP套接字通信是远程通信的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通信机制时每每令程序员感受到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,并且RPC未能作到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出如今世人面前,它被设计成一种面向对象的通信方式,容许程序员使用远程对象来实现通讯,而且支持多线程的服务,这是一次远程通信的革命,为远程通讯开辟新的里程碑。java
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,可以让在某个 Java 虚拟机上的对象调用另外一个 Java 虚拟机中的对象上的方法。能够用此方法调用的任何对象必须实现该远程接口。程序员
RMI的开发步骤服务器
实例源码:多线程
首先为服务创建一个Model层,注意由于此对象须要现实进行远程传输,因此必须继承Serializable分布式
package com.blankjor.rmi; import java.io.Serializable; /** * @desc 传输持久层话数据对象,必须实现Serializable接口 * @author Blankjor * @date 2017年5月30日 下午3:28:45 */ public class EntityData implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String tel; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
建立远程接口MyRemote,注意远程接口必需要继承Remoteide
package com.blankjor.rmi; import java.rmi.Remote; import java.rmi.RemoteException; /** * @desc 远程接口,实现Remote * @author Blankjor * @date 2017年5月30日 下午2:49:05 */ public interface MyRemote extends Remote { EntityData sayHello() throws RemoteException; }
创建MyRemoteImpl实现远程接口MyRemote,注意此为远程对象实现类,须要继承UnicastRemoteObject,UnicastRemoteObject实现了须要的远程接口this
package com.blankjor.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * @desc 接口实现,为了完成一些远程的功能,借助UnicastRemoteObject,自动实现 * @author Blankjor * @date 2017年5月30日 下午2:50:39 */ public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote { /** * 必须实现,为了抛出 RemoteException * * @throws RemoteException */ protected MyRemoteImpl() throws RemoteException { } @Override public EntityData sayHello() throws RemoteException { EntityData ed = new EntityData(); ed.setId(1); ed.setName("lyc"); ed.setTel("110"); return ed; } }
创建远程服务端,并开启后进行注册spa
package com.blankjor.rmi; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; /** * @desc 注册远程服务服务端 * @author Blankjor * @date 2017年5月30日 下午2:54:26 */ public class MyRemoteServer { public static void main(String[] args) { try { System.out.println("远程服务正在启动,等待调用..."); // 实例化远程服务对象 MyRemote remote = new MyRemoteImpl(); // 进行注册绑定 LocateRegistry.createRegistry(1234); Naming.rebind("rmi://localhost:1234/RemoteHello", remote); } catch (Exception e) { e.printStackTrace(); } } }
运行后结果:.net
客户端进行远程服务的访问,调用
package com.blankjor.rmi; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * @desc 调用远程服务的客户端 * @author Blankjor * @date 2017年5月30日 下午3:00:02 */ public class MyRemoteClient { public static void main(String[] args) { try { // 寻找远程服务 MyRemote service = (MyRemote) Naming.lookup("rmi://localhost:1234/RemoteHello"); // 调用远程服务方法 EntityData ed = service.sayHello(); System.out.println("Welcome " + ed.getName()); } catch (MalformedURLException | RemoteException | NotBoundException e) { e.printStackTrace(); } } }
运行后结果:
参考:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html
http://lavasoft.blog.51cto.com/62575/91679/