Java RMI - Remote Method Invocation
。
Java RMI 是一种机制,能够让【A】虚拟机上对象调用【B】虚拟机上对象的方法。
Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。
大名鼎鼎的EJB都是建立在RMI基础之上的,现在还有一些开源的远程调用组件,其底层技术也是RMI。
package RMI.hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 定义一个远程接口,必须继承Remote接口。
* 其中需要远程调用的方法必须抛出RemoteException
* @author Administrator
*
*/
public interface IHello extends Remote {
public String helloWorld() throws RemoteException;
public String sysHelloToSomeBody(String someBodyName) throws RemoteException;
}
package RMI.hello;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {
private static final long serialVersionUID = 7739737989785929846L;
protected HelloImpl() throws RemoteException {
super();
}
@Override
public String helloWorld() throws RemoteException {
return "Hello World!";
}
@Override
public String sysHelloToSomeBody(String someBodyName) throws RemoteException {
return "你好" + someBodyName + "!";
}
}
package RMI.hello;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* 创建RMI注册表
* 启动RMI服务
* 将远程对象注册到RMI注册表中
*
* @author Administrator
*
*/
public class HelloServer {
public static void main(String[] args) {
try {
// 创建RMI注册表 - 本地主机上的远程对象注册表Registry的实例,并指定端口为8888
// java默认为1099, 缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8888);
// 创建远程对象
IHello rhello = new HelloImpl();
// 把远程对象注册到RMI注册服务器上,命名为RHello
// 绑定的URL标准格式为:rmi://host:port/name
// 协议名可以省略
Naming.bind("rmi://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();
}
}
}
package RMI.hello;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
* 客户端测试,在客户端调用远程对象上的方法,并返回结果
* @author Administrator
*
*/
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.sysHelloToSomeBody("盐城小土包"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
缺点:
- 太过于依赖服务器IP地址和端口
- Java语言程序的调用 - 两端程序必须是java语言实现的
解决:
- 通过DNS来解决
- 通过封装将IP暴露在程序之外 - 属性文件 or 配置文件
分享到:
相关推荐
RMI-iiop版HelloWorld,dos命令行下执行。感谢http://lavasoft.blog.51cto.com/62575/240666和http://blog.csdn.net/konglong_c/article/details/4972447,希望给大家提供帮助。
NULL 博文链接:https://dannyhz.iteye.com/blog/2300802
07-RMI-HelloWorld则是一个简单的RMI入门示例,帮助初学者理解RMI的工作原理。 3. **SMTP(Simple Mail Transfer Protocol)**:12-SMTP-Example是使用JavaMail API发送邮件的示例。SMTP协议定义了电子邮件的传输...
这个"java rmi HelloWorld版(源码)"的压缩包文件提供了一个简单的RMI应用示例,帮助开发者了解和学习RMI的基本原理和使用。 RMI的核心概念包括: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口...
眼镜蛇RMI-IIOP示例应用程序 该存储库是分布式应用程序中的和的概念证明(POC)。 例如 , , 和 api。 它是协议的替代方法。 该应用程序允许您使用spring gui和命令行管理电话簿。 关于RMI-IIOP RMI-IIOP (称为...
**标题解析:** "JMX HelloWorld Download" 指的是一个关于Java Management Extensions(JMX)的简单示例,可能是用于教学或演示如何在Java应用中使用JMX技术。"Download"表明这是一个可以下载的资源,可能包含了...
监控 一个用于演示ELK的多节点节点应用程序的简单示例。 建造 ./build-all.sh ...docker rmi -f `docker images -qa` 加载脚本 index.js脚本可用于施加负载- node index.js <url> <delay> <randomisation>
<create class="com.example.HelloWorld" javascript="HelloWorld"> ``` 这段配置表示允许JavaScript创建一个名为`HelloWorld`的对象,并可以调用其中的`getName`方法。 3. **创建Java类**:创建一个名...
支持远程调用功能,例如EJB、JMS、RMI、Hessian、Burlap、HttpInvoker、JAX-RPC等。 10. **spring-support.jar** 提供了一些额外的功能支持,如缓存管理、定时任务、邮件服务等。 11. **spring-web.jar** ...
return "Hello, World!"; } } ``` - **注册远程对象**:在服务器端,实例化`HelloWorldImpl`,然后将其注册到Registry,绑定到特定的名字,如`"HelloServer"`。 ```java HelloWorldInterface hello = new ...
**DWR(Direct Web Remoting)入门教程之HelloWorld** DWR是一款开源的Java库,它允许在浏览器和服务器之间进行实时的、双向的通信,实现了JavaScript与Java之间的直接调用,极大地简化了Web应用程序的开发。DWR的...
public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld { public HelloWorldImpl() throws RemoteException { super(); } @Override public String sayHello() { return "Hello, ...
本文将基于"Dubbo入门之HelloWorld"的主题,深入探讨如何从零开始学习并实践Dubbo的基本用法。 首先,我们需要了解什么是RPC(Remote Procedure Call)。RPC是一种使程序可以调用另一个系统中的函数或方法的技术,...
5. **"HelloWorld"示例**:具体展示了如何创建一个简单的"HelloWorld"服务,例如定义一个返回字符串的`sayHello`方法,然后在客户端调用这个方法并打印出结果。 6. **源码分析**:博主可能深入到Hessian的源码层面...
在"rmi_helloworld"这个小程序中,可能包含了以下步骤: 1. 定义一个远程接口,声明远程方法。 2. 创建实现远程接口的类,并实现远程方法。 3. 在服务器端启动RMI注册表,将远程对象导出并注册到注册表中。 4. 在...
客户端程序`Helloworld`通过`Naming.lookup()`方法从RMI注册表中查找并获取`HelloIn`接口的实例。`lookup`方法接受一个URL形式的字符串,指定了远程对象的名称和主机。然后,客户端可以像操作本地对象一样调用`...
在这个例子中,服务器创建了一个实现HelloWorld接口的远程对象,并将其绑定到RMI注册表。客户端则通过RMI注册表查找并调用了远程对象的sayHello方法。 总结,RMI是Java平台中强大的分布式计算工具,它简化了跨JVM的...
#### 三、RMI HelloWorld 示例分析 为了更好地理解RMI的工作原理,我们可以通过一个简单的HelloWorld示例来进行分析。 ##### 1. 文件结构与目录设置 在这个示例中,所有的Java源文件都位于`example.hello`包下,...
System.out.println(remote.hello("World")); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上就是RMI的基本原理和使用方法。在实际开发中,可以通过阅读"RMI 初步研究报告.doc"文档,深入了解...