RMI定位服务器对象的问题:

bxh777 2003-08-01 11:25:58
RMI定位服务器对象的问题:
【引自】《Java2核心技术 卷II》P202
访问服务器(ServerA)上的远程对象,客户机需要一个本地代码存根对象。客户机怎样请求到这样一个代码存根对象?最普通的方法就是调用另一个服务器(ServerB)对象的远程方法,得到一个作为返回值的代码存根对象。Sun RMI程序库提供“引导程序注册服务”(bootstrap registry service)定位第一个服务器对象。
服务器程序以“引导程序注册服务”注册对象。客户机检索这些对象的代码存根[1],将对象引用和名称传递给“引用程序注册服务”[2],你可以注册一个服务器对象[3],它的名称是一个字符串,具有唯一性。
疑问 1. ServerA 不等于 ServerB吗,为什么客户机不能访问ServerA上的远程对象呢?
2. [1]处,客户机如何检索这些对象的代码存根?[2]处,为什么还要把对象引用和名称传递给“引用程序注册服务”,“引用程序注册服务”已经定位第一个服务器对象,怎么还需要再次传递参数呢?[3]处,注册的服务器对象在分布式系统中是什么角色,是stub or skel,还是 Server?如果是Server,不明白它的作用。
...全文
59 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
honkyjiang 2003-09-30
  • 打赏
  • 举报
回复
可以把rmiregistry看成是最简单的名字服务
客户端java.rmi.Naming.lookup("rmi;//bigserver:1234/testService");
通过rmiregistry(通过URL定位远程对象的实例)
testserver gService = new testservr();
服务端 : Naming.rebind("/testserver",gService); 用rebind将gservice与testserver实例
与名称相关联 !!
因为先启动了rmiregistry根据_Stub 和 _Skel 就有了相关联 !!
noratong 2003-09-30
  • 打赏
  • 举报
回复
看来你还没理引导程序注册表服务到底起什么作用。我建议你再看看这本书的285页的倒数第二段,好好看看理解一下引导程序注册表服务的作用。

还有你最后几个问题,看来是你对书上的文字含义不太理解。像【2】和【3】处都是指你将要注册的那个远程服务器对象,并不是其它的。其它的可以通过这个已经注册的对象来得到。也就是通过方法传递参数来得到。
flashspy 2003-09-30
  • 打赏
  • 举报
回复
我的理解是:
你有很多需要RMI调用得服务端类,一般的解决方法是每个一个客户用RMI连一个SERVER
比如:ClientA连ServerA,ClientB连ServerB,ClientC连ServerC.传统的方法是编译时rmic每一个服务端类产生相应的Stub代码存根。这样就会产生3个连接。
书上的意思时,用一个Client和Server相连,编译时就只用rmic一个类,ServerA,ServerB,ServerC通过Server的某个方法返回相应的Stub,这样就只用一个连接。这是一种设计模式,提供一个连接通道,供其他需要连接的调用社用,而不是自己建立新的连接。

服务端通过引导程序注册服务将某个对象实例用和一名称(字符传)绑定到某个端口,客户端通过连接服务器端口和服务器注册时使用的名称取得改对象的Stub实例引用。从而通过客户端调用Stub起到调用到Server的作用。
具体方法如上
bxh777 2003-09-28
  • 打赏
  • 举报
回复
我这里有相关的文档,我找找看
bxh777 2003-08-02
  • 打赏
  • 举报
回复
我记得以前别人讲CORBA是这样讲ORB,在网络中可以在任意的一台机子上建立ORB服务,它可以向任意的Client提供服务,当Client访问的某个ORB挡掉后,Client可以自动寻找新的ORB为其服务。网络中第一个ORB服务是由“引导程序注册服务”提供的。

如果上述思想正确的话,如何解释RMI定位服务器对象时前面提出的问题呢?
bdsc 2003-08-01
  • 打赏
  • 举报
回复
如果你在客户端什么也没有安装(stub,remote interface),你怎样进行rmi的调用呢?

实际上你可以从某个地方下载客户端需要的所有的代码!你所要做的是写个简单的bootstrap程序。

bootstrap的实现我知道有3种,以上只是一种。

解释:
ServerA是你实现的rmi服务器
SErverB实际就是RMI registry

所以RMI bootstrap实现是:
1 public interface MyRmiBootstrap extends java.rmi.remote {
Runable getClient() throws RemoteException;
}

2
public class RmiClientBootstrap {
static String bootstrapServer = ...; //RMI registry URL
public static void main(String [] args) {
System.setsecurityManager(new RMISecurityManager());
MyRmiBootstrap boot = (MyRmiBootstrap)Naming.lookup(bootStrapServer);
Runable client = boot.getClient();
client.run();
}
}

顺次思路,其他两种是:
1,用RMIClassLoader,从codebase用classname取到client
2, 用MarshalledObject从一URL读入client
注意:client是runable的,并且client已经知道需要的stub skeleton server helper class在哪里!
keyinwind 2003-08-01
  • 打赏
  • 举报
回复
它说的SERVER B是不是指的 LDAP服务呢?
bxh777 2003-08-01
  • 打赏
  • 举报
回复
Help me!

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧