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 ...
随机推荐
- Mvc视图引擎、寻址规则
目前MVC中用的较多的视图引擎应该是WebFormViewEngine和RazorViewEngine了. 一个Request请求首先会进入Routing进行判断,对于错误的url是不能被路由匹配到的 ...
- 我的.NET自学之路
我第一门语言接触的并不是.net,而是php刚学php感觉还好,但是一学到后面就有一点头晕乎乎的,我感觉没有一个好的编写php代码的编辑器.而且php是弱类型语言,感觉起来没有像c,java,c#这些 ...
- Leetcode 255. Verify Preorder Sequence in Binary Search Tree
验证一个list是不是一个BST的preorder traversal sequence. Given an array of numbers, verify whether it is the co ...
- c#使用正则表达式抓取a标签的链接和innerhtml
//读取网页html string text = File.ReadAllText(Environment.CurrentDirectory + "//test.txt", Enc ...
- IIS如何配置可以下载APK、IPA文件
解决步骤: 1).打开IIS服务管理器,找到服务器,右键-属性,打开IIS服务属性: 2.单击MIME类型下的“MIME类型”按钮,打开MIME类型设置窗口: 3).单击“新建”,建立新的MIME类型 ...
- IntelliJ IDEA For Mac 快捷键
Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...
- CIDR详解和ip最长地址前缀匹配
1.CIDR是什么 无类域间路由(CIDR)编址方案 摒弃传统的基于类的地址分配方式,允许使用任意长度的地址前缀,有效提高地址空间的利用率. 就是一个ip加一个网络掩码,不过这个掩码不是之前只有3个值 ...
- poj1006Biorhythms(同余定理)
转自:http://blog.csdn.net/dongfengkuayue/article/details/6461298 本文转自head for better博客,版权归其所有,代码系本人自己编 ...
- 如何查看Maven项目中的jar包依赖树情况
对于开发人员,我想大家对于Maven应该不会陌生吧,如何在一个Maven项目中对这个项目中所引用的第三方jar包有个直观的了解呢? 其实实现很简单,只需要借助于Maven的一条命令,如下所示: mvn ...
- Yii rules常用规则
public function rules() { return array( //必须填写 array('email, username, password, ...