1
  1. 我知道,曾经,开发远程代理包括生成存根/骨架,尽管由于反射,今天不再需要。(动态代理)

我想清楚地解释反射为什么以及如何取代这种需求。例如,我知道存根是为了处理网络上的通信(如果远程对象在另一台计算机上),加上负责序列化/反序列化等......现在谁负责?

也许我把动态代理的概念都弄错了。

  1. 此外,我阅读了有关 Java 和 Rmi 的主题,我将如何在 C++ 中实现远程代理,我可能可以使用 DCOM,还有另一种可能更简单的方法吗?(我是否需要 DCom 中的存根/骨架或不再像 java 一样?)

谢谢

4

2 回答 2

1

说你有一个interface A, 和class B implements A

服务器 VM 有一个 B 实例;它与名称相关联;服务器侦听 TCP 端口以进行客户端通信。像这样的东西:

Server server = new Server(localhost, port);
server.bind("bbbb", new B() );

在客户端 VM 上,您希望访问驻留在服务器 VM 上的 B 对象。您需要获得对它的引用(A 类)

A bb = lookup(serverIp, port, "bbbb");

bb是 的子类A,由 . 创建java.lang.reflect.Proxy。任何方法调用bb都由 处理InvocationHandler,它以任何方式对调用进行编码,并通过线路将其发送到服务器。服务器收到“在名为 bbbb 的对象上调用此名称的方法 [with these arguments]”的请求,并且服务器通过反射执行该任务没有问题。然后以类似的方式将返回值发送回客户端。

所以自己做这件事真的不难。Sun 的 RMI 可能也在做同样的事情(RMI 还有一些其他功能,比如远程垃圾收集)。见http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html

于 2009-12-04T01:59:27.013 回答
0

如果我没记错的话,存根/骨架是由 rmic 工具静态创建的,而现在整个过程是动态的。

并不是说它一定“更好”,而只是消除了编译存根和骨架的麻烦。在这两种情况下,请求参数和响应几乎在同一级别以相同的方式序列化。

至于问题 #1:RMI 的某些实现使用 Corba,因此如果代码可用,您可能想查看它。

您所需要的只是将您的 C++ 代码与 Corba 层接口,就像存根/骨架所做的那样。

于 2009-12-11T20:56:21.777 回答