在学习序列化的时候发现了一个东西叫RMI,来学习一下
概念 远程调用 RMI(Remtoe Method Invocation) 顾名思义就是本地JVM通过网络远程调用另一个JVM上的某个方法。采用客户端/服务器通信方式(C/S)。需要在服务器上部署提供服务的远程对象,然后在客户端请求访问服务器上远程对象的方法。
RMI框架采用代理(Proxy)来负责客户端和服务端之间通信的细节。RMI框架分别生成了客户端代理和服务端代理。位于客户端的代理被称为存根(Stub),位于服务端的代理类被称为骨架(Skeleton)。
存根(Stub): 客户端调用远程对象时,实际上是通过本地代理对象(Stub)来进行的。Stub负责将方法调用转发到远程对象。
骨架(Skeleton): 位于服务端的代理对象,用于接受来自客户端的请求,并将请求转发给实际的远程对象。
使用流程 1.创建远程接口 远程接口,需要直接或者间接的继承Remote(java.rmi.Remote)接口,远程接口声明了可以被客户端访问的远程方法。而且接口中的方法都要抛出RemoteException(java.rmi.RemoteException)异常。
这里实现了一个求和方法。
import java.rmi.Remote; import java.rmi.RemoteException; interface HelloServer extends Remote { public int Sum(int a,int b) throws RemoteException; } 2.创建远程类 远程类用于实现远程接口。为了使远程类的实例能够提供服务,还需要把它导出为远程对象。有下面两种途径:
子类化UnicastRemoteObject import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; class HelloServerImpl extends UnicastRemoteObject implements HelloServer{ //远程类的构构方法必声明抛出RemoteException异常 public HelloServerImpl() throws RemoteException{ } @Override public int Sum(int a, int b) throws RemoteException { return a+b; } } 调用exportObject方法(如果远程类已经继承了其他类,无法继承UnicastRemoteObject。) import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; class HelloServerImpl [extends OtherClass] implements HelloServer{ public HelloServerImpl() throws RemoteException { //端口0代表监听任意一个匿名端口 UnicastRemoteObject.exportObject(this, 0); } @Override public int Sum(int a, int b) throws RemoteException { return a+b; } } 3.创建服务器程序 RMI有一个注册表,注册表将一个名称映射到远程对象。 服务器使用注册表注册其远程对象,以便可以查找它们。 客户端想要调用远程对象上的方法时,它必须首先使用其名称查找远程对象。
...