最近写了个RMI的Demo,虽然很简单,但是中间走了很多弯路,现在整理一下,以便大家参考
整个项目结构如下:
client.java
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//System.setSecurityManager(new RMISecurityManager());
String url = "/sayhello";
Hello RMIObject = (Hello)Naming.lookup(url); // 寻得对象
System.out.println( RMIObject.sayHello("lions") );
} catch (RemoteException exc) {
System.out.println("Lookup error: " + exc.toString());
} catch (java.net.MalformedURLException ex) {
System.out.println("Malformed URL: " + ex.toString());
} catch (java.rmi.NotBoundException e) {
System.out.println("Not Bound: " + e.toString());
}
}
}
Hello.java
import java.rmi.Remote;
import java.rmi.RemoteException;
//public interface Hello extends Serializable, Remote {
public interface Hello extends Remote {
public String sayHello(String name) throws RemoteException;
}
MyHello.java
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MyHello extends UnicastRemoteObject implements Hello {
public MyHello() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
public String sayHello(String name) throws RemoteException {
// TODO Auto-generated method stub
return "Hello, " + name;
}
}
Server.java
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
public class Server {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
//if (System.getSecurityManager() == null) {
//System.setSecurityManager(new RMISecurityManager());
//}
// System.setSecurityManager(new RMISecurityManager());
//LocateRegistry.createRegistry(8808); // 注册端口
MyHello server = new MyHello();
// Binding
Naming.rebind("/sayhello", server); // 将实现类绑到一个名字上去
}catch(java.net.MalformedURLException me){
System.out.println("Malformed URL:" + me.toString());
}catch(RemoteException e){
System.out.println("Remote Exception:" + e.toString());
}
}
}
client.bat
java Client
@pause
command.bat
cmd
rmi.policy
grant {
// Allow everything for now
permission java.security.AllPermission;
};
rmireg.bat
rmiregistry
@pause
server.bat
java Server
@pause
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
Aug 4, 2008 9:36:42 AM
RMIDemo
description
Lions
====================================================================== -->
<project name="project" default="default">
<description>
RMIDemo
</description>
<property name="src" value="./src"/>
<property name="bin" value="./bin"/>
<property name="build" value="./dist"/>
<property name="script" value="./script"/>
<property name="classpath" value=""/>
<property name="class" value="MyHello"/>
<property name="jarfile" value="${build}/hello.jar"/>
<!-- =================================
target: default
================================= -->
<target name="default" depends="clean" description="--> description">
<javac srcdir="${src}"
destdir="${bin}"
classpath="${classpath}"
source="1.4">
</javac>
<rmic classname="${class}" base="${bin}"/>
<jar destfile="${jarfile}" basedir="${bin}"></jar>
<copydir dest="${build}" src="${script}"></copydir>
</target>
<!-- - - - - - - - - - - - - - - - - -
target: clean
- - - - - - - - - - - - - - - - - -->
<target name="clean">
<delete>
<fileset dir="${build}">
<include name="*"/>
</fileset>
</delete>
<delete>
<fileset dir="${bin}">
<include name="*"/>
</fileset>
</delete>
</target>
</project>
上面的比较简单,在运行中有一点要特别注意,一定要把stub类加到环境变量classpath中,或者将hello.jar加到classpath中,不然会出现找不到stub类的错误。
首先运行rmireg.bat,启动rmiregistry。
然后运行server.bat,启动服务端。
最后运行client.bat,启动客户端,可以看到输出:hello,lions
OK,测试成功!
关于security manager,这里没有使用,但给了个policy的示例,代码里也有参考的写在注释里,可以试验下。
运行时有个参数 -Djava.rmi.server.codebase,之前设置了反而不能运行,不用倒是没有问题,还不太明白这个有什么用。
如果是远程调用,client代码修改如下:
String url = "rmi://192.168.0.119/sayhello";
Hello RMIObject = (Hello)Naming.lookup(url); // 寻得对象
远程只需要拷贝client.bat和hello.jar包,clent如下修改:
java -cp hello.jar Client
运行就可以看到结果。
如果网络不可访问,或是有防火墙,都会导致不可访问,需要和程序错误相区别对待。
分享到:
相关推荐
这个"JAVA RMI简单例子"旨在帮助我们深入理解RMI的基本原理和实现步骤。 RMI的核心概念包括远程接口、远程对象和RMIC编译器。首先,我们需要定义一个远程接口,该接口声明了可以在远程服务器上执行的方法。这些方法...
### Java RMI基础知识与示例解析 ...通过以上详细分析,我们可以清楚地了解到如何使用Java RMI来实现简单的分布式应用。尽管RMI在现代Java开发中的使用频率不高,但了解其基本原理和技术细节仍然具有一定的价值。
在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何实现一个基本的Spring RMI应用。 首先,让我们了解RMI的基本概念。RMI允许Java对象在不同的JVM之间进行通信,仿佛它们都在同一台机器上。它通过...
根据提供的文件信息,本文将详细解释RMI(远程方法调用)的概念、工作原理以及一个简单的RMI示例。RMI是一种Java技术,允许在不同的Java虚拟机(JVM)之间进行远程过程调用。 ### RMI简介 RMI是Java平台提供的一种...
远程方法调用(Remote Method Invocation,RMI)是Java平台上的一个重要特性,它允许一个Java对象在一台机器上执行另一个网络中的Java对象的方法。RMI是分布式计算的基础,使得Java程序能够跨越网络边界,实现组件...
文件中提到的RMI实例,主要涉及到了RMI的接口定义、远程对象实现、服务器端注册以及客户端调用等几个关键步骤。 #### 接口定义 `RmiMonitorService`接口定义了远程服务接口,包含了`interactive`方法,该方法接收...
以下是对"java RMI简单例子"的详细解释: 1. **RMI的基本概念**: - **远程对象**:在RMI中,一个对象如果可以在不同的JVM上执行其方法,那么就被称为远程对象。 - **远程接口**:定义远程对象需要实现的接口,...
创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...
这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...
通过这个简单的实例,学习者可以了解到Java RMI的基本工作流程,以及如何在实践中部署和使用远程对象。深入研究后,还可以探索更复杂的场景,如并发调用、安全性控制、容错机制等,以构建更加健壮和高效的分布式系统...
6. **异常处理**:RMI调用可能会抛出`java.rmi.RemoteException`和其他相关异常,如`NotBoundException`(未找到绑定的远程对象),`MalformedURLException`(URL格式错误)。这些异常需要在客户端代码中适当地捕获...
本实例将深入讲解如何使用Java RMI在Linux环境中启动远程服务,并在Windows环境下进行操作。 首先,理解RMI的基本原理:RMI系统由两部分组成,客户端和服务器端。服务器端暴露远程接口,客户端通过引用这个远程接口...
2. 查找并获取远程对象:使用` LocateRegistry.getRegistry(serverHost, port)`获取RMI注册表,然后通过`Naming.lookup("rmi://serverHost:port/MyRemoteInterface")`查找并获得远程对象的引用。 3. 调用远程方法:...
在这个简单的代码例子中,我们将探讨RMI的基本概念、实现步骤以及如何创建并运行一个基本的RMI应用程序。** 首先,理解RMI的核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,继承自`...
### RMI最简单的一个实例解析 #### 一、RMI简介与应用场景 远程方法调用 (RMI) 是 Java 平台提供的一种机制,允许在一台机器上的虚拟机中的对象调用另一台机器上虚拟机中的对象的方法。RMI 结合了面向对象技术与...
- **客户端查找**:客户端使用`java.rmi.Naming.lookup()`方法查找并获取远程对象的引用,然后通过此引用调用远程方法。 - **通信协议**:RMI使用TCP/IP进行网络通信,通过序列化对象和方法调用信息在客户端与...
在本实例中,我们将详细了解如何创建一个简单的RMI应用。 首先,我们要定义一个远程接口。在Java RMI中,所有可被远程调用的方法都必须在一个实现了`Remote`接口的接口中声明。这个接口被称为远程接口。例如: ```...
服务器端提供远程对象,而客户端通过RMI调用这些远程对象的方法。传统的RMI流程通常涉及到`rmic`命令,用于生成客户端所需的存根(Stub)和 skeletons(框架),但在这个例子中,我们将利用Java 1.2之后引入的动态...
- **注册表**:RMI注册表是一个服务,用于将远程对象的引用与名称关联起来,使得客户端可以通过名称查找并调用远程对象。 2. **RMI异步调用原理**: - 异步调用通常涉及到回调或未来(Future)对象的概念。客户端...
- **异常处理**:RMI调用可能会抛出`RemoteException`和其他与网络通信相关的异常,需要适当地捕获和处理。 - **安全性**:由于涉及到网络通信,因此要考虑安全性问题,例如使用SSL/TLS加密通信,或者对远程对象...