远程过程调用应用在分布式环境中,我想你第一个问题是不是理解上有偏差(个人拙见),rmi并不是客户端在不知情的情况下就可以调用,而是一个整体的设计,照你的理解那非要webservice了,这是可以的,因为可以发布自己的信息。但是其实其中的过程还是根据查找到有关信息进行“配置”才调用的
问题2没有研究过,但是你可以看看生成的代码,我想应该是线程吧

解决方案 »

  1.   

    对于问题一:
    我想问的是通常情况下RMI是以什么方式把stub分发到客户端的?按照 jornny(引力)的说法,那应该可以用如下方式:
    把客户端需要的远程接口和stub打包(附上远程接口的说明),然后提供给客户端下载。
    但是有个问题是:如果服务器端又新定义了一些远程方法,此时客户端怎么做呢?不能动态更新吧?
    难道又让服务器端把新生成的远程接口和stub大包,客户端再重新下载?
    另外,其中客户端和服务器端相互动态下载class是怎么完成的呢?
      

  2.   

    客户端的编码其实很简单,如果和服务器用同一个jvm可以直接用context/lookup查找localhome接口,声称实例就可以直接用了,如果不在一个jvm内,就需要自己编写客户端的编码,写法基本相同,注意查找的接口是home接口,并且句柄需要序列化,就是调用narrow.partable那个方法,你自己查查,我记不准了。和服务器的连接需要在客户端的conf文件里创建jndi.properites文件,定义服务器的地址和端口,以及连接方法和相应的jar文件就可以了
      

  3.   

    关于问题一,我知道一点,关于stub的分发有两种方式,一种是直接在客户端的classpath得到,这个可以节约网络资源,但是不能动态更新stub。另外一种方式是同过在启动服务端时候
    通过java -Djava.rmi.server.codebase=url 指向stub和远程接口的所在。这样就可以动态更新stub。
      

  4.   

    关于动态加载在http://java.sun.com/j2se/1.4.2/docs/guide/rmi/codebase.html有清楚的说明。
      

  5.   

    多谢 nicolas2(霹雳小猪) ,对于你说的“关于stub的分发有两种方式,一种是直接在客户端的classpath得到”,你的意思是不是把stub的位置加载到classpath中,但是这样的前提是stub已经在客户端了锕?并没有达到分发的目的
      

  6.   

    是啊,这样不用通过registry程序分发啊,如果没有的话,类的下载方式就如applet在浏览器中,每次都会下载啊。