Java RMI(Remote Method Invocation) 入坑心得

RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的革命,为远程通信开辟新的里程碑。

经过一番折腾,对于此模式的一些心得如下:

  1. 程序仍然分为Server/Client两个部分,分别运行在网络连接两端。
  2. Server/Client两个部分的中介是RMI服务器rmiregistry,这是一个JRE中自带的可执行文件,但是貌似安装时默认不会把他加到Path中。
  3. Server首先连接到rmiregistry,注册自身;然后Client也连接进去,搜索自己要的Server,所以实际执行网络通讯的是rmiregistry
  4. Server端的实现:首先定义一个Interface extends java.rmi.Remote,然后从实现这个接口并在实现时extends java.rmi.server.UnicastRemoteObject
  5. Client端编码时直接引用此接口即可,然后用java.rmi.Naming.lookup(url)来获取一个此接口的实例;url中包含了Server地址和刚才注册的服务名,"//" + host + "/" + serverName
  6. 此时,在Client端调用接口中的函数,Server端就会实际执行这个函数。
  7. 编译:服务器端需要两次编译,首先javac xxx.java正常编译一次,然后rmic xxx.java编译出来一个xxx__Stub.class;但貌似Java 8之后就不需要这个步骤了。
  8. 运行时的classpath问题:服务端实际上运行着两个进程:运行Server的java进程,以及rmiregistry;二者都需要完整的classpath,缺一不可;如果rmiregistry找不到某个class,错误是在Client端报出来的,这一点很坑。

有代码的教程

  • 最后更改: 2019/05/27 13:54