java rmi的问题

为了创建一个远程对象,可以使它直接扩展UnicastRemoteObject,它将使这个类链接进RMI系统,在这种方式下要提供一个抛出emoteException异常的构造函数。并且调用super()

 

RMI中的参数传递:

Primitive参数:以一种机器无关的方式来直接传值

Object参数RMI将对象本身而不是它的引用在JVMs之间传送,是对象本身 而不是引用通过值传递。使用的机制是对象序列化机制。

Remote Object参数:对于一个实现了remote的对象,它返回一个代理的引用

 

RMI系统布署:

服务器端需要以下类:

l         远程服务接口定义

l         远程服务实现

l         实现类的Skeletons(只在基于JDK1.1的服务器上使用)

l         实现类的Stubs

l         所有其它的服务器类

 

客户端需要的类:

l         远程服务接口定义

l         实现类的Stubs

l         客户端使用到的服务类

l         所有的其它客户端类

 

RMI的设计同时也支持类的自动分发

JAVARMI中的参数都必须实现了java.io.Serializable,在核心类库中的大部分类都实现了它。

 

安全管理器的指定:如果没有指定安全管理器,那么除了那些可以在CLASSPATH中可以找到的类,其它类不会自动下载

 

For security reasons, an application can bind or unbind only to a registry running on the same host. This prevents a client from removing or overwriting any of the entries in a server's remote registry. A lookup, however, can be done from any host.

 

 

The RMI registry is a simple server-side name server that allows remote clients to get a reference to a remote object. Typically, it is used only to locate the first remote object an application needs to talk to. Then that object in turn would provide application-specific support for finding other objects.

注意:在你启动rmiregistry之前,你必须确保你将运行它的shell窗口没有设置CLASSPATH属性或者在CLASSPATH中不能找到需要下载到客户端的类,包括你的远程对象的实现类的Stub类。

       如果你启动rmiregistry,并且它能在它的CLASSPATH中找到stub类,它将忽略服务器的java.rmi.server.codebase属性,结果是你的客户端半不能下载远程对象的Stub代码。要想了解代码下载在RMI,请看教程Dynamic code downloading using RMI.

       当启动服务器时,java.rmi.server.codebase属性必须指定,以便Stub类能被动态地下载到注册程序,然后下载到客户端。运行服务器,将codebase属性设置成stub实现的所在地。

注意:一个stub类只在它在本地不可获取并且java.rmi.server.code属性被正确设置为可以在服务器定位它的情况下才动态下载它。

 

运行时要注意的问题:
1
、使用过rmic,并将编译出的根代码放在服务器目录(不仅仅是在服务器的下载目录)。

2、启动rmiregistry的目录最好在运行java的目录。

3、客户端程序一定要加载安全管理器。

system.setSecurityManager(new RMISecurityManager())

4、正确配置命令行参数比如:java -Djava.security.policy=c:\policy.all -Djava.rmi.server.codebase=http://localhost:8085/ ProductorServer

posted on 2004-12-17 12:29  bhjk  阅读(355)  评论(0)    收藏  举报

导航