远程和动态代理

时间:2009-12-03 22:24:00

标签: java c++ com proxy rmi

  1. 我明白,一旦开发远程代理包括生成存根/骨架,尽管今天由于反射不再需要。 (动态代理)
  2. 我希望得到一个明确的解释,说明为什么以及如何反映这种需要。 例如,我知道存根是假设通过网络处理通信(如果远程对象在不同的​​计算机上),加上负责序列化/反序列化等等......谁现在负责呢?

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

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

2 个答案:

答案 0 :(得分:1)

说你有interface Aclass 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");

bbA的子类,使用java.lang.reflect.Proxy创建。 bb上的任何方法调用都由InvocationHandler处理,{{1}}以任何方式对调用进行编码,并通过线路将其发送到服务器。服务器收到“在对象命名的bbbb上调用此名称[带有这些参数]的方法”的请求,服务器使用反射执行该任务没有问题。然后以类似的方式将返回值发送回客户端。

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

答案 1 :(得分:0)

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

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

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

您需要的只是将C ++代码与Corba层接口作为存根/骨架。