RMI远程方法调用讲解教程
RMI远程方法调用讲解教程 2009-04-13 15:07:38
1、RMI概述
RMI(Remote Method Invocation)
RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信。
必须在jdk1.1以上
RMI用到的类
java.rmi.Remote
所有可以被远程调用的对象都必须实现该接口
java.rmi.server.UnicastRemoteObject
所有可以被远程调用的对象都必须扩展该类
什么是RMI
远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,
使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程
序语法规则和在本地机上对象间的方法调用的语法规则一样。
优点
这种机制给分布计算的系统设计、编程都带来了极大的方便。
只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。
任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。
1、面向对象:
RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。
也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。
2、可移动属性:
RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
3、设计方式:
对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。
所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型
——就会失去设计方式上所提供的优点。
4、安全性:
RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
5、便于编写和使用
RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。
远程接口实际上就是Java接口。
为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程
接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。
新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了
远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将
作为远程对象引用。
创建远程方法调用的5个步骤:
1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
2、定义一个实现该接口的类。
3、使用RMIC程序生成远程实现所需的残根和框架。
4、创建一个客户程序和服务器进行RMI调用。
5、启动Registry并运行自己的远程服务器和客户程序。
第一步、扩展远程接口
创建一个RMI程序首先要做的就是创建一个扩展远程接口的接口。在这个接口中可以添加任意希望能在
远程机器上调用的方法。
接口示例
import java.rmi.Remote;
import.java.rmi.RemoteException;
public interface RemoteInterface extends java.rmi.Remote
{
public String start(String msg) throws RemoteException;
}
在接口中定义了一个返回字符串的方法
本地接口(RemoteInterface)必须是公共的,否则客户机在加载一个实现该接口的远程对象时就会出错。
它必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。
抛出这个异常的原因
由于任何远程方法调用实际上要进行许多低级网络操作,因此网络错误可能在调用过程中随时发生。
因此,所有的RMI操作都应放到try-catch块中。
第二步、定义一个实现该接口的类。
该类必须继承UnicastRemoteObject类。
扩展java.rmi.server.UnicastRemoteObject
UnicastRemoteObject顾名思义,是让客户机与服务器对象实例建立一对一的连接。
扩展实现接口的类例程
服务器关键语句
Naming.rebind("/RMITest",rmiTest);
//名字和接口绑定
第三步、生成残根和框架代码
在RMI中,客户机上生成的调动调用参数和反调动返回值的代码称为残根。有的书上称这部分代码为“主干”。
服务器上生成的反调动调用参数和进行实际方法调用调动返回值的代码称为框架。
生成残根和框架的工具
Rmic命令行工具(RMI Compiler)
格式:
Rmic classname
第四步、创建一个客户程序进行RMI调用
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
public class RemoteClientTest{
static RemoteInterface gserver=null;
void display(){
try{//查找远程对象
gserver=(RemoteInterface)Naming.lookup("//localhost/RMITest");
String msg=gserver.start();
System.out.println("服务器返回信息:"+msg);}
catch (Exception e1) {System.out.println(e1);}
}
public static void main (String[] args){
RemoteClientTest app=new RemoteClientTest();
app.display();}
}
客户端端关键语句
gserver=(RemoteInterface)Naming.lookup("//localhost/RMITest");
//查找远程对象
第五步、用RmiRegistry找到远程对象
这是一个使用工具,维护文本名和远程对象之间的映射,可以进行远程访问。
RMI远程方法调用讲解教程相关推荐
- Java RMI远程方法调用详解
Java RMI远程方法调用详解 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51992182 一.Java R ...
- (转)Java RMI远程方法调用详解
Java RMI远程方法调用详解 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51992182 一.Java RMI机制 ...
- jsp+ssm+mysql实现简单的物流快递管理系统源码+讲解教程+参考论文+开题报告
今天发布的是一款简单的物流快递管理系统,本系统是基于我们的ssm框架的万能脚手架实现的,感兴趣的童鞋可以去学习一下脚手架系统.本系统主要实现的功能有:前端公司主页.政策.新闻咨询.联系地址.在线留言. ...
- python正则表达式语法-python正则表达式语法大全讲解教程实例一
东尧爱分享 这是东尧每天一篇文章的第32天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 在python爬虫中,我们经常会需要进行字符串的匹配,而正则表达式是一种用来匹配字符 ...
- Java RMI(远程方法调用) 实例与分析 (转)
目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...
- Spring之RMI 远程方法调用 (Remote Method Invocation)
RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...
- 【全网最全最细】青龙面板搭配Ninja+依赖+Ninja配置的超细讲解教程!!!
Title 前言 1.连接finalshell或者xshell 2.停止容器(把以下代码复制粘贴进去) 3.删除容器(把以下代码复制粘贴进去) 4.安装安装docker-compose(把以下代码复制 ...
- Android多线程:这是一份全面 详细的线程池(ThreadPool)讲解教程
前言 对于多线程,大家应该很熟悉.但是,大家了解线程池吗? 今天,我将带大家全部学习关于线程池的所有知识. 目录 1. 简介 2. 工作原理 2.1 核心参数 线程池中有6个核心参数,具体如下 上述6 ...
- Java RMI远程方法调用学习总结
RMI开发步骤总结如下: 1.声明的实体对象需要进行远程传输,需要继承Serializable. 2.创建远程接口及声明远程方法,需要继承Remote. 3.实现远程接口及远程方法,需要继承Unica ...
最新文章
- 力扣(LeetCode)刷题,简单题(第21期)
- RAC 修改 DB 实例名 步骤
- Modeling Filters and Whitening Filters
- pthread_detach 常规使用记录
- gpio模拟pwm_模拟智能台灯
- Linux查看用户信息/查看所有用户信息的命令
- php调用python绘图程序_如何在matlab中调用python程序
- django.forms生成HTML,python – 在django中为表单自动生成表单字段
- Unity基础——刚体
- 【计算机网络】SIP会话时,使用重定向与不使用重定向功能的区别
- c语言书199页第12题,单片机C语言入门实例和最常见问题分析(含程序部分了)(199页)-原创力文档...
- 稀土配合物Ln(DBM)3(Cz-PBM)|Tb(DBM)3(Cz-PBM)|Gd(DBM)3(Cz-PBM)|Ir(L)2(DBM-Ox)Ir(L)2(DBM-Cz)qiyue
- 如何使用微信邮箱注册?个人邮件邮箱注册
- LiveData的使用及详解
- java合并单元格边框不完整,java poi 合并单元格后边框问题
- 华为模拟器ENSP router设备上display ip routing-table详解
- 不一样的解决Non-static method 'xxx' cannot be referenced from a static context
- S7-1200PLC CPU集成模拟量输入通道接线和编程
- xcode 正确的使用断点
- 站住,你这个Promise!
热门文章
- 请求拦截_实战SpringCloud通用请求字段拦截处理
- element vue 动态单选_软件更新丨vue-element-admin 4.0.0 beta 发布,后台集成方案
- android 保存textview,为什么没有TextView(带ID)会自动保存它的状态?
- java如何画周期sanjiao信号_如何声明一个可变长度的std_logic_vector信号
- rocktmq 消息延时清空_使用Kotlin+RocketMQ实现延时消息的示例代码
- 撕裂者cpu三代文件服务器,AMD三代线程撕裂者CPU开盖:钎焊散热、64核若隐若现...
- c++ map iterator 获取key_前K个高频的元素衍生之Map的Value与Key排序
- IOS 从系统图库中获取 图片 并设置为头像
- 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
- 网络协议 19 - RPC 协议:远在天边近在眼前