RMI软件包的描述
RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。
RMI简单实现
1、客户端提供远程接口2、服务端拿到接口并实现接口里的所有方法3、在RMI注册表上注册服务端地址和远程接口对象4、客户端调用
声明:为了方便,本人的所有java文件都在同一文件夹内
定义远程访问接口
首先由客户端提供需要远程访问的接口,由服务端来实现,接口代码如下:
import java.rmi.Remote; public interface IRMIface extends Remote {//继承远程对象Remote //由于继承了Remote,所以方法中要抛出RemoteException异常 public long add(long a,long b) throws java.rmi.RemoteException; }
服务端实现接口
接口实现代码如下:
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class RMIfaceImpl extends UnicastRemoteObject implements IRMIface { private static final long serialVersionUID = 1L; protected RMIfaceImpl() throws RemoteException{ //这个构造方法不能少 //网上有人说是因为继承了UnicastRemoteObject用来抛出异常用的 //具体还未深入研究 } @Override public long add(long a, long b) throws RemoteException { return a+b; } }
服务端注册接口
注册接口代码:import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class RemoteBinding { public static void main(String[] args) { try{ IRMIface myRemote = new RMIfaceImpl(); System.out.println("=========start binding==========="); LocateRegistry.createRegistry(8088);//注册端口 Naming.rebind("rmi://localhost:8088/remoteRMI", myRemote);//绑定 System.out.println("=========OK==========="); }catch(Exception e){ e.printStackTrace(); } } }
编写客户端代码
import java.rmi.Naming; public class MyRequest { public static void main(String [] args){ try{ System.out.println("=========RMI remoteRMI==========="); IRMIface myRemote = (IRMIface) Naming.lookup("rmi://localhost:8088/remoteRMI"); System.out.println("=========RMI OK remoteRMI==========="); long test = myRemote.add(10L, 20L); System.out.println(test); }catch(Exception e){ e.printStackTrace(); } } }
测试运行
CMD打开命令窗口进入到java文件所在的文件夹,编译好所有的类(以下操作均在class文件的文件夹下)
第一步、用rmiregistry命令启动服务
第二步、新开一个窗口输入命令 java RemoteBinding 运行服务端绑定接口
第三步、再新开一个窗口输入命令 java MyRequest 运行客户端调用
注意:以上顺序不能换