`
helloyesyes
  • 浏览: 1296067 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

RMI调用的简单实例

阅读更多

最近写了个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

运行就可以看到结果。

如果网络不可访问,或是有防火墙,都会导致不可访问,需要和程序错误相区别对待。

分享到:
评论

相关推荐

    RMI简单实例RMI简单实例

    文件中提到的RMI实例,主要涉及到了RMI的接口定义、远程对象实现、服务器端注册以及客户端调用等几个关键步骤。 #### 接口定义 `RmiMonitorService`接口定义了远程服务接口,包含了`interactive`方法,该方法接收...

    JAVA RMI简单例子

    这个"JAVA RMI简单例子"旨在帮助我们深入理解RMI的基本原理和实现步骤。 RMI的核心概念包括远程接口、远程对象和RMIC编译器。首先,我们需要定义一个远程接口,该接口声明了可以在远程服务器上执行的方法。这些方法...

    Java RMI的简单例子

    ### Java RMI基础知识与示例解析 ...通过以上详细分析,我们可以清楚地了解到如何使用Java RMI来实现简单的分布式应用。尽管RMI在现代Java开发中的使用频率不高,但了解其基本原理和技术细节仍然具有一定的价值。

    spring RMI简单例子

    在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何实现一个基本的Spring RMI应用。 首先,让我们了解RMI的基本概念。RMI允许Java对象在不同的JVM之间进行通信,仿佛它们都在同一台机器上。它通过...

    rmi简单例子

    根据提供的文件信息,本文将详细解释RMI(远程方法调用)的概念、工作原理以及一个简单的RMI示例。RMI是一种Java技术,允许在不同的Java虚拟机(JVM)之间进行远程过程调用。 ### RMI简介 RMI是Java平台提供的一种...

    rmi的实例rmi的实例rmi的实例

    远程方法调用(Remote Method Invocation, RMI)是Java平台上的一个重要特性,它允许一个Java对象在一台机器上执行另一个网络中的Java对象的方法。RMI是分布式计算的基础,使得Java程序能够跨越网络边界,实现组件...

    RMI的简单完整例子

    远程方法调用(Remote Method Invocation,RMI)是Java平台上的一个重要特性,它允许一个Java对象在一台机器上执行另一个网络中的Java对象的方法。RMI是分布式计算的基础,使得Java程序能够跨越网络边界,实现组件...

    java RMI简单例子

    以下是对"java RMI简单例子"的详细解释: 1. **RMI的基本概念**: - **远程对象**:在RMI中,一个对象如果可以在不同的JVM上执行其方法,那么就被称为远程对象。 - **远程接口**:定义远程对象需要实现的接口,...

    一个java RMI应用实例 构建简单的RMI应用

    创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...

    通过Java RMI实现远程调用的一个简单例子

    这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...

    java rmi 简单易懂的实例

    通过这个简单的实例,学习者可以了解到Java RMI的基本工作流程,以及如何在实践中部署和使用远程对象。深入研究后,还可以探索更复杂的场景,如并发调用、安全性控制、容错机制等,以构建更加健壮和高效的分布式系统...

    java 远程调用rmi实现的简单例子

    6. **异常处理**:RMI调用可能会抛出`java.rmi.RemoteException`和其他相关异常,如`NotBoundException`(未找到绑定的远程对象),`MalformedURLException`(URL格式错误)。这些异常需要在客户端代码中适当地捕获...

    java远程调用rmi实例

    本实例将深入讲解如何使用Java RMI在Linux环境中启动远程服务,并在Windows环境下进行操作。 首先,理解RMI的基本原理:RMI系统由两部分组成,客户端和服务器端。服务器端暴露远程接口,客户端通过引用这个远程接口...

    RMI入门好例子

    2. 查找并获取远程对象:使用` LocateRegistry.getRegistry(serverHost, port)`获取RMI注册表,然后通过`Naming.lookup("rmi://serverHost:port/MyRemoteInterface")`查找并获得远程对象的引用。 3. 调用远程方法:...

    RMI(远程方法调用)简单代码例子

    在这个简单的代码例子中,我们将探讨RMI的基本概念、实现步骤以及如何创建并运行一个基本的RMI应用程序。** 首先,理解RMI的核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,继承自`...

    RMI最简单的一个实例

    ### RMI最简单的一个实例解析 #### 一、RMI简介与应用场景 远程方法调用 (RMI) 是 Java 平台提供的一种机制,允许在一台机器上的虚拟机中的对象调用另一台机器上虚拟机中的对象的方法。RMI 结合了面向对象技术与...

    对 RMI 的简单理解

    - **客户端查找**:客户端使用`java.rmi.Naming.lookup()`方法查找并获取远程对象的引用,然后通过此引用调用远程方法。 - **通信协议**:RMI使用TCP/IP进行网络通信,通过序列化对象和方法调用信息在客户端与...

    RMI远程方法调用RMI远程方法调用

    当客户端执行RMI调用时,它实际上是调用了Stub对象的方法。Stub会将参数序列化并封装成网络消息,通过网络发送给服务器。服务器的Skeleton接收到消息后,反序列化参数并调用对应的远程实现方法。处理完成后,返回值...

    RMI简单实例.docx

    在本实例中,我们将详细了解如何创建一个简单的RMI应用。 首先,我们要定义一个远程接口。在Java RMI中,所有可被远程调用的方法都必须在一个实现了`Remote`接口的接口中声明。这个接口被称为远程接口。例如: ```...

    rmi 远程方法调用很简单例子

    服务器端提供远程对象,而客户端通过RMI调用这些远程对象的方法。传统的RMI流程通常涉及到`rmic`命令,用于生成客户端所需的存根(Stub)和 skeletons(框架),但在这个例子中,我们将利用Java 1.2之后引入的动态...

Global site tag (gtag.js) - Google Analytics