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)的更多相关文章

  1. Spring之RMI 远程方法调用 (Remote Method Invocation)

    RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...

  2. Spring Remoting: Remote Method Invocation (RMI)--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...

  3. java的RMI(Remote Method Invocation)

    RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ...

  4. K:java中的RMI(Remote Method Invocation)

    相关介绍:  RMI全称是Remote Method Invocation,即远程方法调用.它是一种计算机之间利用远程对象互相调用,从而实现双方通讯的一种通讯机制.使用这种机制,某一台计算机(虚拟机) ...

  5. RMI(Remote Method Invocation ) 概念恢复

    1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...

  6. Java远程方法调用(RMI)

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  7. 【杂谈】对RMI(Remote Method Invoke)的认识

    前言 对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了.当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白.现在对网络和I/O有了 ...

  8. Java自带RPC实现,RMI框架入门

    Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...

  9. bubbo调用Failed to invoke remote method异常解决

    bubbo调用服务异常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getPlanFlowInfo, pr ...

随机推荐

  1. iOS音乐播放器相关

    iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌 ...

  2. Unity 难点目录

    1.mesh的任意切割.(难点) 2.扇形区域识别玩家.(解决) 3.NGUI横滑同时竖滑,或滑动同时点击冲突处理.(解决)

  3. poj1006Biorhythms(同余定理)

    转自:http://blog.csdn.net/dongfengkuayue/article/details/6461298 本文转自head for better博客,版权归其所有,代码系本人自己编 ...

  4. HD2222 Keywords Search(AC自动机入门题)

    然而还不是很懂=_= #include <iostream> #include <cstring> #include <algorithm> #include &l ...

  5. UGUI

    http://www.2fz1.com/post/unity-ugui-recttransform/ //this.transform.position 获取的是世界坐标,而 this.transfo ...

  6. 大熊君大话NodeJS之------(Url,QueryString,Path)模块

    一,开篇分析 这篇文章把这三个模块拿来一起说,原因是它们各自的篇幅都不是很长,其次是它们之间存在着依赖关系,所以依次介绍并且实例分析.废话不多说了,请看下面文档: (1),"Url模块&qu ...

  7. PHP 表单

    PHP 中的 $_GET 和 $_POST 变量用于检索表单中的信息,比如用户输入. 表单验证: 应该在任何可能的时候对用户输入进行验证(通过客户端脚本).浏览器验证速度更快,并且可以减轻服务器的负载 ...

  8. c标签遍历List<Map<String, Object>> 数据格式

    <c:forEach varStatus="loop" var="dataMap" items="${dataMap}"> &l ...

  9. [Machine Learning] Learning to rank算法简介

    声明:以下内容根据潘的博客和crackcell's dustbin进行整理,尊重原著,向两位作者致谢! 1 现有的排序模型 排序(Ranking)一直是信息检索的核心研究问题,有大量的成熟的方法,主要 ...

  10. [Search Engine] 搜索引擎分类和基础架构概述

    大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...