客户端打开套接字连接服务器上特定的端口,查找到正在运行的 注册表,因为注册表本身也是个远程对象,返回注册表远程对象的stub到本地,然后客户端通过stub同服务器通信,执行lookup方法,查找到远程接口,并返回这个远程对象的stub到本地,然后客户端对服务器端的访问完全通过这个stub来执行。
因为对象序列化时传送的只是对象的状态,并没有传送 执行的代码,所以需要将客户端需要找到类定义,先从本地的classpath中查找,如果没有,客户端试图从存储在注册表中的远程对象的codebase中查找。然后从codebase的路径中,下载类定义。当受到所有类定义,stub就开始调用服务器对象的相应方法了。stub和sketelon分别是客户端和服务器段的代理,stub是个远程对象。都是用rmic在服务器端生成的。客户端访问的时候,就把stub下载到本地,所以都服务器段的调用实际上通过stub来执行。在jdk1.2之后,sketelon已经不用了,你可以把stub反编译了看看,里面是采用的反射来实现的。

解决方案 »

  1.   

    回:
      谢谢!
      还有一点就是在实现远程调用时,服务器端包含的扩展了remote接口的接口的类文件.实现了前面接口的类的类文件和最后在服务器端用来绑定对象和名字并通知注册表的类的类文件和所有的stub文件不能包含在服务器的类路径中?这是什么原因?
      

  2.   

    你自己写的程序,要把客户端与服务器端分开,你将stub文件放在服务器的类路径中有什么用?一起发布还有可能引来不必要的安全隐患。