RMI中的中继是什么?

时间:2011-12-21 06:02:45

标签: java networking network-programming rmi

RMI 中的接力是什么?我一直在谷歌搜索呼叫序列,但没有得到任何满意的结果。我无法理解存根在客户端和服务器端的角色, RMI注册在服务器机器启动后做了什么? 主服务器代码的时间如下:

import java.net.*;
import java.rmi.*;

public class AddServer { // when is this code executed 
  public static void main(String args[]) {
    try {
      AddServerImpl addServerImpl = new AddServerImpl();
      Naming.rebind("AddServer",addServerImpl); // what is it doing ?
    } catch(Exception exc) {
        System.out.println("Exception : " + exc);
      }
  }
 }   

执行了吗?

RMI中的骨架是什么?

我看到了下面的图片 image 在维基百科上,但无法理解它是如何运作的,什么是存根和骨架?何时调用接口实现?

谁调用了实际调用的服务器机器上的远程方法?

1 个答案:

答案 0 :(得分:0)

我不确定你的问题是什么,以及你不清楚的事情。

非常简单:

1)RMI是一种允许网络上不同Java进程相互通信的技术。

2)RMI不是显式发送网络消息(例如,直接读取和写入套接字),而是使它看起来像是对RMI程序的标准方法调用。

RMI处理从客户端打包“方法参数”并通过网络发送它们的详细信息,以及在接收端解压缩它们的详细信息,以便服务器可以处理它们。

这一切都发生在“幕后”,对客户端和服务器程序都是透明的。

3)客户端“幕后”是“存根”; “幕后”的服务器端是客户端。 RMI注册表只是让客户端“找到”服务器,并将正确的存根与正确的骨架匹配。

4)服务器的RMI运行时始终是“侦听”(对于客户端请求),但仅在需要时调用各个服务器对象。

5)你引用了一张图片:但这里有完整的解释(包括图片):

http://en.wikipedia.org/wiki/Java_remote_method_invocation

6)如果你仍然“不明白”,这里有另一个可能有用的链接:

http://docs.oracle.com/javase/tutorial/rmi/overview.html

--- ADDENDUM 12/21/2011 ---

  问:请你解释一下骨架

     

问:调用Naming.rebind(...)的方法是什么时候?

     

问:还有什么存根在服务器端做什么?

彼得范德林登(Peter van der Linden)引用最优秀的Just Java 2

1)“RMI”(远程方法调用)意味着一个系统上的对象可以调用系统中其他位置的对象中的方法。

2)您的客户端对象与“存根”对话。它看起来像是对客户端的对象调用,但事实上,存根负责获取传入的参数并将它们传输给服务器计算机上的伙伴。

3)客户端如何查找它是服务器计算机上的伙伴?客户端调用“java.rmi.Naming.Lookup()”。

4)服务器如何了解关于您的RMI服务器类?通过调用“java.rmi.Naming.bind()”,Java服务器 TOLD 注册表。

5)服务器类如何知道如何获取客户端的远程调用?有几种方法,但希望您只需通过从java.rmi.server.UnicastRemoteObject派生服务器类,让自己轻松生活。

6)什么是“骨架”?它是客户端“存根”的服务器端模拟。它只是一个简单的例行程序,除了解压缩客户端存根通过网络传输的数据之外什么都不做。

如果仍然不清楚,只需输入一个示例并观察其行为。

从命令行运行它,并在服务器命令行中指定“java -Djava.rmi.server.logCalls = true ...”,以查看正在进行的RMI调用。

'希望有所帮助!