论坛首页 入门技术论坛

Java分布式之RMI实例教程

浏览 12183 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-08-31  
入门比较不错
0 请登录后投票
   发表时间:2010-09-20  
楼主辛苦了,非常不错:)
0 请登录后投票
   发表时间:2011-01-12  
我也是在core java2上跑不通,yidao620c说按LZ的跑通了,请问是如何跑通的?另外,core java2没有明确的使用rmic在客户端存根,而有些帖子上讲到了这一点。
想问LZ两个问题:
1.如何运行此例。
2.rmic存根是否必要,或者说采用了其它方式代替了。
期待LZ的回复!
0 请登录后投票
   发表时间:2011-01-12   最后修改:2011-02-28
1.在eclipse里直接run运行就行了,没什么特别的东西。
2.我没看过core java2,所以不知道你们说的rmic在客户端存根是指什么。从rmi原理上来说stub和skelete肯定是要有的。这里用的是jdk.5.0,rmic是不用运行的了,java通过动态代理和反射自动完成了。
这里是UnicastRemoteObject类jdk里的一些说明,供你参考:

public class UnicastRemoteObject extends RemoteServer用于导出带 JRMP 的远程对象和获得与该远程对象通信的 stub。 

对于下面的构造方法和静态 exportObject 方法,正在导出的远程对象的 stub 按以下方式获得: 


如果使用 UnicastRemoteObject.exportObject(Remote) 方法导出该远程对象,则加载 stub 类(通常使用 rmic 工具从远程对象的类预生成)并按以下方式构造 stub 类的实例。 
“根类”按以下情形确定:如果远程对象的类直接实现扩展 Remote 的接口,则远程对象的类为根类;否则,根类为直接实现扩展 Remote 接口的远程对象类的最具派生能力的超类。 
要加载的 stub 类的名称通过连接带有后缀 "_Stub" 的根类的二进制名称确定。 
按使用根类的类加载器的名称加载 stub 类。该 stub 类必须扩展 RemoteStub 并且必须有公共构造方法,该构造方法有一个属于类型 RemoteRef 的参数。 
最后,用 RemoteRef 构造 stub 类的实例。 
如果无法找到适当的 stub 类,或无法加载 stub 类,或创建 stub 实例时出现问题,则抛出 StubNotFoundException。 

对于所有其他导出方式: 

如果无法加载远程对象的 stub 类(如上所述)或将系统属性 java.rmi.server.ignoreStubClasses 设置为 "true"(不分大小写),则用以下属性构造 Proxy 实例: 
代理的实例由远程对象类的类加载器定义。 
该代理实现由远程对象类实现的所有远程接口。 
代理的调用处理程序是用 RemoteRef 构造的 RemoteObjectInvocationHandler 实例。 
如果无法创建代理,则抛出 StubNotFoundException。 

否则,将远程对象的 stub 类(如上所述)的实例用作 stub
0 请登录后投票
   发表时间:2011-01-12  
这里服务程序和客户端程序貌似都运行在本机了吧,那RMI岂不是没有意义了,假如如客户端运行在其它机器上呢?LZ尝试或将localhost改为其它机器的IP吗?
0 请登录后投票
   发表时间:2011-01-12  
空谷悠悠 写道
这里服务程序和客户端程序貌似都运行在本机了吧,那RMI岂不是没有意义了,假如如客户端运行在其它机器上呢?LZ尝试或将localhost改为其它机器的IP吗?

实际的运行环境当然是外面的系统。这里是个例子。
0 请登录后投票
   发表时间:2011-01-12  
public String ip = "localhost";  将RMI服务器注册到IP指定到主机上,这里是本地的,假如注册到它机上呢,你试过吗?难道也能运行?没有在客户端存根注册RMI服务器恐怕不行吧。
0 请登录后投票
   发表时间:2011-01-12   最后修改:2011-01-12
空谷悠悠 写道
public String ip = "localhost";  将RMI服务器注册到IP指定到主机上,这里是本地的,假如注册到它机上呢,你试过吗?难道也能运行?没有在客户端存根注册RMI服务器恐怕不行吧。

换个ip,试运行一下就行了呀。
说得清楚些吧。你server bind什么ip,你client就连什么ip就行了。
server:
            LocateRegistry.createRegistry(port);   
            // 创建一个远程对象   
            RmiMonitorService comm = new RmiMonitorServiceImpl();   
            Naming.bind("//" + 192.xx + ":" + port + "/comm", comm); 
 

那么你client:
            // 在RMI服务注册表中查找名称为RmiMonitorService的对象,并调用其上的方法   
            monitorService = (RmiMonitorService) Naming.lookup("rmi://" + 192.xx   
                    + ":" + port + "/comm"); 
0 请登录后投票
   发表时间:2011-02-01  
最小的行动比最大的想法伟大, 不管入不入门级, 至少精神可嘉, 比光说不做充大爷的强多了.
---------支持java,支持开源
0 请登录后投票
   发表时间:2011-02-28  
空谷悠悠 写道
我也是在core java2上跑不通,yidao620c说按LZ的跑通了,请问是如何跑通的?另外,core java2没有明确的使用rmic在客户端存根,而有些帖子上讲到了这一点。
想问LZ两个问题:
1.如何运行此例。
2.rmic存根是否必要,或者说采用了其它方式代替了。
期待LZ的回复!

最近在整理代理模式知识时,再看了一下rmi代理。在Jdk5.0中,java通过动态代理和反射自动生成stub存根。我们程序中不再需要再做这一步。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics