Java远程方法调用(Remote Method Invocation,RMI)
Java RMI简介:
它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上。
Java RMI在JDK1.1版本已经存在,是非常重要的底层技术。
下面通过一个简单的例子来测试:
package com.tc.remote; import java.rmi.Remote;
import java.rmi.RemoteException; /**
* 一个远程调用接口RMIQueryStatus
* 远程接口必须声明为public
* 远程接口必须继承自java.rmi.Remote
*/
public interface RMIQueryStatus extends Remote{ // 远程调用中的方法必须抛出RemoteException异常
RMIFileStatus getFileStatus(String filename) throws RemoteException; }
package com.tc.remote; import java.io.Serializable; /**
* RMI文件状态类,远程调用方法返回的对象
*/
public class RMIFileStatus implements Serializable{ private String filename; public RMIFileStatus() {
} public RMIFileStatus(String filename) {
this.filename = filename;
} @Override
public String toString() {
return "RMIFileStatus{" +
"filename='" + filename + '\'' +
'}';
} }
package com.tc.remote; import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; /**
* 远程接口的实现 .
*/
public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus { /**
* 因为UnicastRemoteObject的构造函数抛出了RemoteException异常
* 这里默认构造方法必须写
* @throws RemoteException
*/
public RMIQueryStatusImpl() throws RemoteException {
} @Override
public RMIFileStatus getFileStatus(String filename) throws RemoteException {
RMIFileStatus status = new RMIFileStatus(filename);
// ...进行处理
return status;
} }
package com.tc.remote; import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; /**
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
*/
public class RMIQueryStatusServer { public static String RMI_URL = "rmi://localhost:8888/RHello"; public static void main(String[] args) {
try {
RMIQueryStatusImpl queryStatus = new RMIQueryStatusImpl();
// 注册表创建
LocateRegistry.createRegistry(8888);
// 绑定远端对象到名字
Naming.rebind(RMI_URL,queryStatus);
// Naming.bind(RMI_URL,queryStatus);
// bind方法在已经为一个名字绑定一个对象,再向此名称绑定对象,会抛出异常
// 而使用rebind方法不会
System.out.println(">>>>>INFO:远程RMIQueryStatus对象绑定成功!");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
} }
package com.tc.remote; import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; /**
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
*/
public class RMIQueryStatusClient { public static void main(String[] args) {
try {
RMIQueryStatus queryStatus = (RMIQueryStatus) Naming.lookup(RMIQueryStatusServer.RMI_URL);
// 调用远程方法,该调用如同调用本地方法
RMIFileStatus status = queryStatus.getFileStatus("爆炸");
System.out.println(status);
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
} }
先运行RMIQueryStatusServer 的main方法:

注意:虽然main方法的执行很快,但是服务器还是会继续运行的,红色的方块表示了运行。
再运行RMIQueryStatusClient 的main方法:

这里只是简单的进行了测试,感觉Client需要拿到Server的RMI_URL,还是有比较强的依赖性。
希望实际项目中用到以后能够有更深刻的理解。
http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/index.html
Java远程方法调用(Remote Method Invocation,RMI)的更多相关文章
- Spring之RMI 远程方法调用 (Remote Method Invocation)
RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...
- Spring Remoting: Remote Method Invocation (RMI)--转
原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...
- java的RMI(Remote Method Invocation)
RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ...
- K:java中的RMI(Remote Method Invocation)
相关介绍: RMI全称是Remote Method Invocation,即远程方法调用.它是一种计算机之间利用远程对象互相调用,从而实现双方通讯的一种通讯机制.使用这种机制,某一台计算机(虚拟机) ...
- RMI(Remote Method Invocation ) 概念恢复
1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...
- Java远程方法调用(RMI)
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- 【杂谈】对RMI(Remote Method Invoke)的认识
前言 对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了.当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白.现在对网络和I/O有了 ...
- Java自带RPC实现,RMI框架入门
Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...
- bubbo调用Failed to invoke remote method异常解决
bubbo调用服务异常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getPlanFlowInfo, pr ...
随机推荐
- centos 防火墙
让防火墙放通tcp的 80端口: [root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent 重启防火墙以 ...
- Maven随记
如何保持依赖的多个jar保持版本一致 在引入依赖的时候常常需要依赖多个独立的模块, 譬如Spring的content, aop等等, 为了保持版本一致, 可以设置<spring.version& ...
- poi导出的excel的数字小数位过多?
最近在使用Apache的POI组件对Excel进行操作,在对excel导出的时候,导出的数字本来只有两位小数,得到的结果就变成了很多位小数.如下面的图所示: 虽然对单元格使用了setCellStyle ...
- System.Diagnostics.Process.Star的用法
System.Diagnostics.Process.Start(); 能做什么呢?它主要有以下几个功能: 1.打开某个链接网址(弹窗). 2.定位打开某个文件目录. 3.打开系统特殊文件夹,如“控制 ...
- MySQL连表操作之一对多
引入 当我们在数据库中创建表的时候,有可能某些列中值内容量很大,而且重复. 例子:创建一个学生表,按学校年纪班级分,表的内容大致如下: id name partment 1 xxx x学校x年级x班级 ...
- COGS746. [网络流24题] 骑士共存
骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...
- Spring retry基本使用
Spring retry基本使用 背景介绍 在实际工作过程中,重试是一个经常使用的手段.比如MQ发送消息失败,会采取重试手段,比如工程中使用RPC请求外部服务,可能因为网络 波动出现超时而采取重试手段 ...
- Xcode6 管理provisioning profile
profile文件的存放位置为 /Users/用户名/Library/MobileDevice/Provisioning Profiles 更新profile文件后,Code Signing Iden ...
- rpm---linux软件安装与管理
linux的安装命令选项太多,整理一下,方便后期查找. 汇总: install: rpm -ivh 包全名 安装 upgrade: rpm -Uvh 包全名 升级 erase: rpm -e 包名 删 ...
- ubuntu常用命令
<一> 安装文件 一.deb包的安装方式 sudo dpkg -i *.deb 二.编译安装方式 建立编译环境sudo apt-get install build-essential 到源 ...