版权声明:如需转载,请标明转载出处哦! https://blog.csdn.net/Z0157/article/details/82049587
一、对RMI的了解
1、Java Remote Method Invocation:即Java RMI ,远程方法调用,它是jdk内部的一个实现,是远程过程调用(RPC: Remote Procedure Calls)的一种面向对象思想的java语言实现,支持直接传输序列化(serializable)的Java类和分布式垃圾收集(distributed garbage-collection)。
- serializable:就是java的序列化机制,implements Serializable;
- distributed garbage-collection:简称DGC,分布式垃圾收集(DGC)是垃圾收集的一种特殊情况,远程客户机可以在其中保存对对象的引用。
2、最初的实现依赖于Java虚拟机(JVM)类表示机制,因此它只支持从一个JVM调用到另一个JVM。RMI是基于java远程方法协议(JRMP)实现的。为了支持在非jvm上下文中运行的代码,程序员后来开发了CORBA版本。
- JRMP是专门为java定制的通信协议,所以踏实纯java的分布式解决方案。
- CORBA支持不同操作系统、编程语言和计算硬件上的系统之间的协作、通信。CORBA使用的是面向对象的模型,尽管使用CORBA的系统不必是面向对象的。CORBA是分布式对象范例的一个例子。(有兴趣的同学可以去了解下);
3、java 中RMI的实现在rt.jar中的rmi包中。注意,对于Java 5.0之前的Java版本,开发人员必须使用rmic在单独的编译步骤中编译RMI。5.0之后不再需要这个步骤;
4、RMI流程图
二、java中RMI API 的如何使用
1、实现步骤:(如图)
(1)、创建远程接口, 并且继承java.rmi.Remote接口。
(2)、实现远程接口,并且继承:UnicastRemoteObject。
扫描二维码关注公众号,回复:
3103755 查看本文章
(3)、创建服务器程序: createRegistry方法注册远程对象。
(4)、创建客户端程序。
2、程序代码实现:
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* Description:
* User: zhurong
* Date: 2018-08-22 22:22
*/
public interface ISayHello extends Remote {
public String sayHello(String name) throws RemoteException;
}
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* Description:
* User: zhurong
* Date: 2018-08-22 22:41
*/
public class SayHelloImpl extends UnicastRemoteObject implements ISayHello {
public SayHelloImpl() throws RemoteException {
}
@Override
public String sayHello(String name) throws RemoteException {
return "hello " + name;
}
}
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* Description:
* User: zhurong
* Date: 2018-08-22 22:42
*/
public class HelloServer {
static int port = 8888;
public static void main(String[] args) {
try {
ISayHello iSayHello = new SayHelloImpl();
LocateRegistry.createRegistry(port);
Naming.bind("rmi://localhost:"+port+"/sayHello",iSayHello);
System.out.println("Hello Server start successfully");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
* Description:
* User: zhurong
* Date: 2018-08-23 6:09
*/
public class HelloClient {
static int port = 8888;
public static void main(String[] args) {
try {
ISayHello iSayHello = (ISayHello) Naming.lookup("rmi://localhost:" + port + "/sayHello");
System.out.println(iSayHello.sayHello("jim"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
Hello Server start successfully
hello jim
下一章节我会对RMI的源码进行剖析讲解,同时通过原理手动写一个RMI框架;