RMI实例分析
1.远程对象的本地接口声明(RMIOperate.java)
·
该类仅仅是一个接口声明,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个专有的URL注册它的一个实例。
·
远程接口扩展 java.rmi.Remote
接口。
·
除了所有应用程序特定的例外之外,每个方法还必须在 throws 子句中声明 java.rmi.RemoteException
(或 RemoteException
的父类)。
Hello.java
|
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import
java
.
rmi
.
*
;
// RMI本地接口必须从Remote接口派生
public
interface
Hello
extends
Remote {
// 接口中的具体方法声明,注意必须声明抛出RemoteException
String
sayHello(
String
name)
throws
RemoteException
; }
|
2.远程对象实现类
这个类应实现RMI客户机调用的远程服务对象的本地接口,它必须从UnicastRemoteObject继承,构造函数应抛出RemoteException异常。
HelloImpl.java
|
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import
java
.
rmi
.
*
;
import
javax
.
rmi
.
PortableRemoteObject
;
public
class
HelloImpl extends
PortableRemoteObject implements
Hello {
/* 构造函数 */
public
HelloImpl() throws
RemoteException
{
super
();
}
/* 实现本地接口中声明的'sayHello()'方法 */
public
String
sayHello(String
message) throws
RemoteException
{
System
.out.println("我在RMI的服务器端,客户端正在调用'sayHello'方法。 "
);
System
.out.println("Hello "
+ message);
return
message;
}
}
|
3.RMI服务器类
该类创建远程对象实现类HelloImpl的
一个实例,然后通过一个专有的URL来注册它。所谓注册就是通过Java.rmi.Naming.bind()方法或
Java.rmi.Naming.rebind()方法,将HelloImpl实例绑定到指定的URL上。
HelloServer.java
|
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import
java
.
rmi
.
*
;
public
class
HelloServer {
public
static
void
main(String
[] args) {
// 在服务器端设置安全机制
/*
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
*/
try
{
System
.out.println("开始 RMI Server ..."
);
/* 创建远程对象的实现实例 */
HelloImpl hImpl = new
HelloImpl();
System
.out.println("将实例注册到专有的URL "
);
Naming
.rebind("HelloService"
, hImpl);
System
.out.println("等待RMI客户端调用..."
);
System
.out.println(""
);
} catch
(Exception
e) {
System
.out.println("错误: "
+ e);
}
}
}
|
请注意有关 rebind
方法调用的下列参数:
- 第一个参数是 URL 格式的
java.lang.String
,表示远程对象的位置和名字。
- 需要将
myhost
的值更改为服务器名或 IP 地址。否则,如果在 URL 中省略,则主机缺省值为当前主机,而且在 URL 中无需指定协议(例如“HelloServer
”)。
- 在 URL 中,可以选择提供端口号:例如“/
/myhost:1234/HelloServer”。
端口缺省值为 1099。除非服务器在缺省 1099 端口上创建注册服务程序,否则需要指定端口号。
- 第二个参数为从中调用远程方法的对象实现引用。
- RMI 运行时将用对远程对象 stub 程序的引用代替由
hImpl
参数指定的实际远程对象引用。远程实现对象(如 HelloImpl
实例)将始终不离开创建它们的虚拟机。因此,当客户机在服务器的远程对象注册服务程序中执行查找时,将返回包含该实现的 stub 程序的对象。
4.RMI客户机类
·
RMI客户
使用java.rmi.Naming.lookup()方法,在指定的远程主机上查找RMI服务对象,若找到就把它转换成本地接口RMIOperate类
型。它与CORBA不同之处在于RMI客户机必须知道提供RMI服务主机的URL,这个URL可以通过rmi://host/path或rmi:
//host:port/path来指定,如果省略端口号,就默认使用1099。
·
Java.rmi.Naming.lookup()方法可能产生三个异
常:Java.rmi.RemoteException、Java.rmi.NotBoundException、
java.net. MalformedURLException,三个异常都需要捕获。
HelloClient.java
|
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import
java
.
rmi
.
*
;
public
class
HelloClient {
public
static
void
main(String
[] args) {
// 在服务器端设置安全机制
/*
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
*/
/* 默认为本地主机和默认端口 */
String
host = "localhost:1099"
;
/* 带输入参数时,将host设置为指定主机 */
if
(args.length > 0)
host = args[0];
try
{
/* 根据指定的URL定位远程实现对象 */
/* “h”是一个标识符,我们将用它指向实现“Hello”接口的远程对象 */
Hello h = (Hello) Naming
.lookup("rmi://"
+ host + "/HelloService"
);
System
.out.println("实现“Hello”接口的远程对象: "
+ h);
System
.out.println("我在客户端,开始调用RMI服务器端的'sayHello'方法"
);
System
.out.println("欢迎, "
+ h.sayHello("javamxj blog"
));
} catch
(Exception
ex) {
System
.out.println("错误 "
+ ex);
}
}
}
|
5. 编译代码与运行系统:
在MS-DOS环境下,创建一个D:\RMISample目录,把上面4个文件复制到这个目录下,然后在此目录下新建两个文件夹:client和server(把它们分别看作是客户端与服务端)。
(1).编译所有的源代码
D:\RMISample> javac *.java
(2).生成客户端存根和服务器框架
D:\RMISample> rmic HelloImpl
这将生成HelloImpl_Stub.class
( 注
:如果需要查看这两个类的源代码,可以使用“ rmic -keep HelloImpl”语句)
(3).把Hello.class、HelloClient.class、HelloImpl_Stub.class复制到client目录;
把Hello.class、HelloServer.class、HelloImpl.class、HelloImpl_Stub.class 复制到server目录。
(4).启动RMI注册
D:\RMISample>start rmiregistry
(注:我是在命令控制台下运行这个系统的,必须开启三个控制台窗口,一个运行RMIRegistry,一个运行服务器,还有一个运行客户端。)
(5).运行和调用
● 在服务器上执行HelloServer
D:\RMISample\server>java HelloServer
● 在本地客户机上运行HelloClient
D:\RMISample\client>java HelloClient
● 在远程客户机上运行HelloClient(须指明RMI服务器主机名或IP地址)
java HelloClient 222.222.34.34
运行rmiregistry和server后的结果:
再运行Client后的结果:
分享到:
相关推荐
一个相当经典的RMI实例源代码及详细说明
RMI是开发java网络分布式应用系统的一个重要框架,开发人员通过运用RMI框架将更...该文详细介绍了RMI的运行机制,并对运用RMI框架进行分布式系统的开发步骤进行了阐述,最后给出了RMI技术的具体应用实例和实现方法。
分布式计算是一个非常有意义和挑战的研究方向。Java的多线程和平台独立的特性为在异构系统中实现分布式计算...详细地分析了Java RMI的工作原理,并结合实例分析表明该环境能在复杂的异构系统中有效地实行分布式计算。
218 12.1.3 RMI的优点 219 12.2 一个RMI的简单实例 219 12.3 小结 226 第13章 Web服务概论 227 13.1 SOA简介 227 13.2 Web服务简介 229 13.3 Web服务的核心技术 230 13.3.1 SOAP 232 13.3.2 WSDL 235 13.3.3 UDDI ...
1 上传文件及表单域的请求实体的分析 6. 2. 2 得到上传文件的编程实例 6. 3 使用Servlet下载文件 6. 3. 1 相关的HTTP协议的规定 6. 3. 2 使用Servlet下载文件实例 第7章 在Servlet中使用数据库 7. 1 JDBC...
RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper 分布式系统的基石 从0开始搭建3个节点额度zookeeper集群 深入分析Zookeeper在disconf配置中心的应用 ...
java社交源码品牌感觉后端 后端系统代表了Brand Feeling的旧版本,这是系统的核心,它负责对从社交网络中检索到的文本数据进行数据分析,并将...每个后端实例都由冗余系统()调用,并且还从前端系统()接收用户输入。
SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别...
火龙果软件工程技术中心 引言工作流技术是实现企业业务过程建模、业务过程仿真分析、业务过程优化、业务过程管理与集成,从而最终实现业务过程自动化的核心技术[1]。早期的工作流应用系统都是集中式的,即由一个...
4.4.2 分析SQL异常 4.4.3 组装数据库 4.5 执行查询操作 4.5.1 预备语句 4.5.2 读取和写出LOB 4.5.3 SQL转义 4.5.4 多结果集 4.5.5 获取自动生成键 4.6 可滚动和可更新的结果集 4.6.1 可滚动的结果集 4.6.2 可更新的...
5.2.1 序列化的概念 将在内存中的各种对象的状态(也就是实例变量,不是方法)保存在磁盘中或者在网络中进行传输,并且可以把保存的对象状态再读出来。 将一个Java对象写入IO流;与此对应的,则是从IO流中恢复一个...
强大的工作流中间件保证了系统流程的稳定运行,自定义的工作流中间件也能够根据paas平台的需要而进行调整,并且在课程中讲解了工作流反向同步平台组织机构的功能,工作流提供了RMI服务,从而实现了分布式的部署,...
远程方法调用(RMI) 正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用...
主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. 设计模式引言 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。...
本文实例讲述了WampServer设置apache伪静态出现404 not found及You don’t have permission to access / on this server解决方法。分享给大家供大家参考。具体如下: 出现404 not found 时: 确保LoadModule rewrite_...
本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。...