Java RMI详解

概要:
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。
大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi。
在大力鼓吹Web Service、SOA的时代,是不是每个应用都应该选用笨拙的Web Service组件来实现,通过对比测试后,RMI是最简单的,在一些小的应用中是最合适的。
下面通过一个简单的例子来说明RMI的原理和应用,下面这个例子是一个简单HelloWorld,但已涵盖RMI的核心应用与开发模式。
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 21:50:02
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
*/
public interface IHello extends Remote {
/**
* 简单的返回“Hello World!"字样
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld() throws RemoteException;
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 21:56:47
* 远程的接口的实现
*/
public class HelloImpl extends UnicastRemoteObject implements IHello {
/**
* 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常
*
* @throws RemoteException
*/
public HelloImpl() throws RemoteException {
}
/**
* 简单的返回“Hello World!"字样
*
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld() throws RemoteException {
return "Hello World!";
}
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
*
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
return "你好," + someBodyName + "!";
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 22:03:35
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
*/
public class HelloServer {
public static void main(String args[]) {
try {
//创建一个远程对象
IHello rhello = new HelloImpl();
//本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8888);
//把远程对象注册到RMI注册服务器上,并命名为RHello
//绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
Naming.bind("rmi://localhost:8888/RHello",rhello);
// Naming.bind("//localhost:8888/RHello",rhello);
System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 22:21:07
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
*/
public class HelloClient {
public static void main(String args[]){
try {
//在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello");
System.out.println(rhello.helloWorld());
System.out.println(rhello.sayHelloToSomeBody("熔岩"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
运行RMI服务端程序:
运行RMI客户端程序:
总结:
从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java
# RMI
# RMI简单实例代码
# RMI详细介绍
# java基于RMI远程过程调用详解
# Java RMI机制讲解
# 详解Java 中 RMI 的使用
# java RMI详细介绍及实例讲解
# Java rmi远程方法调用基本用法解析
# Java中的RMI使用方法详解
# 注册表
# 绑定
# 客户端
# 都是
# 问候语
# 抛出
# 来实现
# 机上
# 是一个
# 却是
# 一是
# 两种
# 可以用
# 这个问题
# 它是
# 希望能
# 并将
# 大名鼎鼎
# 非常重要
# 之二
相关文章:
零基础网站服务器架设实战:轻量应用与域名解析配置指南
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
h5在线制作网站电脑版下载,h5网页制作软件?
如何用PHP快速搭建高效网站?分步指南
广东专业制作网站有哪些,广东省能源集团有限公司官网?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
建站之星如何保障用户数据免受黑客入侵?
C#怎么使用委托和事件 C# delegate与event编程方法
如何在西部数码注册域名并快速搭建网站?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
Swift中循环语句中的转移语句 break 和 continue
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何快速搭建自助建站会员专属系统?
建站168自助建站系统:快速模板定制与SEO优化指南
如何在阿里云虚拟服务器快速搭建网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
高防服务器租用如何选择配置与防御等级?
如何通过主机屋免费建站教程十分钟搭建网站?
Android自定义listview布局实现上拉加载下拉刷新功能
小程序网站制作需要准备什么资料,如何制作小程序?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何快速搭建高效WAP手机网站吸引移动用户?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何高效利用亚马逊云主机搭建企业网站?
如何通过PHP快速构建高效问答网站功能?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何使用Golang table-driven基准测试_多组数据测量函数效率
,购物网站怎么盈利呢?
音乐网站服务器如何优化API响应速度?
如何实现建站之星域名转发设置?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何注册花生壳免费域名并搭建个人网站?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
网站制作公司排行榜,抖音怎样做个人官方网站
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
建站主机服务器选购指南:轻量应用与VPS配置解析
制作网站怎么制作,*游戏网站怎么搭建?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
建站之星后台密码遗忘?如何快速找回?
如何在VPS电脑上快速搭建网站?
如何通过VPS建站实现广告与增值服务盈利?
音响网站制作视频教程,隆霸音响官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。