`

Java RMI之HelloWorld篇(转)

    博客分类:
  • Java
阅读更多
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。
大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi。

在大力鼓吹Web Service、SOA的时代,是不是每个应用都应该选用笨拙的Web Service组件来实现,通过对比测试后,RMI是最简单的,在一些小的应用中是最合适的。

下面通过一个简单的例子来说明RMI的原理和应用,下面这个例子是一个简单HelloWorld,但已涵盖RMI的核心应用与开发模式。

/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 21:50:02
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
*/
public interface IHello extends Remote {

    /**
     * 简单的返回“Hello World!"字样
     * @return 返回“Hello World!"字样
     * @throws java.rmi.RemoteException
     */
    public String helloWorld() throws RemoteException;

    /**
     * 一个简单的业务方法,根据传入的人名返回相应的问候语
     * @param someBodyName  人名
     * @return 返回相应的问候语
     * @throws java.rmi.RemoteException
     */
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}

/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 21:56:47
* 远程的接口的实现
*/
public class HelloImpl extends UnicastRemoteObject implements IHello {
    /**
     * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常
     *
     * @throws RemoteException
     */
    public HelloImpl() throws RemoteException {
    }

    /**
     * 简单的返回“Hello World!"字样
     *
     * @return 返回“Hello World!"字样
     * @throws java.rmi.RemoteException
     */
    public String helloWorld() throws RemoteException {
        return "Hello World!";
    }

    /**
     * 一个简单的业务方法,根据传入的人名返回相应的问候语
     *
     * @param someBodyName 人名
     * @return 返回相应的问候语
     * @throws java.rmi.RemoteException
     */
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
        return "你好," + someBodyName + "!";
    }
}

/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 22:03:35
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
*/
public class HelloServer {
    public static void main(String args[]) {

        try {
            //创建一个远程对象
            IHello rhello = new HelloImpl();
            //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
            LocateRegistry.createRegistry(8888);

            //把远程对象注册到RMI注册服务器上,并命名为RHello
            //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
            Naming.bind("rmi://localhost:8888/RHello",rhello);
//            Naming.bind("//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();
        }
    }
}

/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-7 22:21:07
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
*/
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.sayHelloToSomeBody("熔岩"));
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();  
        }
    }
}

总结:
从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。
分享到:
评论

相关推荐

    java rmi HelloWorld版(源码)

    这个"java rmi HelloWorld版(源码)"的压缩包文件提供了一个简单的RMI应用示例,帮助开发者了解和学习RMI的基本原理和使用。 RMI的核心概念包括: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口...

    Java RMI 简单示例

    客户端程序`Helloworld`通过`Naming.lookup()`方法从RMI注册表中查找并获取`HelloIn`接口的实例。`lookup`方法接受一个URL形式的字符串,指定了远程对象的名称和主机。然后,客户端可以像操作本地对象一样调用`...

    JAVA RMI实现程序实例

    Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行远程调用。RMI是构建分布式应用的重要工具,特别适合于需要跨网络通信的服务器端和客户端应用...

    JAVARMI实例[文].pdf

    Java RMI,全称为Java Remote Method Invocation,是Java平台中用于远程对象调用的技术。它允许Java对象在不同的Java虚拟机之间进行通信,仿佛它们在同一个内存空间内一样。RMI是Java分布式计算的核心组成部分,尤其...

    java rmi详细介绍介绍

    return "Hello World!"; } } ``` 3. **服务器端代码**: ```java public class RMIServer { public static void main(String[] args) { try { MyRemote stub = (MyRemote) UnicastRemoteObject.export...

    Java RMI的简单例子

    return "Hello World " + client; } } ``` 这里实现了上面定义的远程接口`RmiHelloRemoteIntfc`。需要注意的是,远程对象的构造函数通常会抛出`RemoteException`,且需要调用`super()`初始化父类`...

    JAVA_RMI_实例.pdf

    接下来,我们创建一个实现了 `HelloInterface` 的类 `Hello`,并继承 `java.rmi.server.UnicastRemoteObject`。这个类提供了远程方法的实现,并处理与远程通信相关的细节。在构造函数中,我们抛出了 `...

    Java RMI Tutorial.pdf

    #### 三、RMI HelloWorld 示例分析 为了更好地理解RMI的工作原理,我们可以通过一个简单的HelloWorld示例来进行分析。 ##### 1. 文件结构与目录设置 在这个示例中,所有的Java源文件都位于`example.hello`包下,...

    Hessian HelloWorld篇

    "Hessian HelloWorld篇"可能是指一篇教程或示例,介绍如何使用Hessian进行简单的远程调用。 这篇博文可能涵盖了以下知识点: 1. **Hessian协议**:解释了Hessian协议的基本原理,包括其二进制格式如何节省带宽和...

    JMX HelloWorld Download

    **标题解析:** "JMX HelloWorld Download" 指的是一个关于Java Management Extensions(JMX)的简单示例,可能是用于教学或演示如何在Java应用中使用JMX技术。"Download"表明这是一个可以下载的资源,可能包含了...

    dwr.jar编写helloworld

    3. **创建Java类**:创建一个名为`HelloWorld`的Java类,包含一个名为`getName`的方法。例如: ```java package com.example; public class HelloWorld { public String getName() { return "Hello, World!"; ...

    DWR入门教程之HelloWorld

    **DWR(Direct Web Remoting)入门教程之HelloWorld** DWR是一款开源的Java库,它允许在浏览器和服务器之间进行实时的、双向的通信,实现了JavaScript与Java之间的直接调用,极大地简化了Web应用程序的开发。DWR的...

    Java RMI Tutorial

    ### Java RMI (Remote Method Invocation) 教程知识点解析 #### 1. **RMI概念介绍** - **RMI**(远程方法调用)是一种Java技术,它允许位于一个Java虚拟机(JVM)上的对象调用另一个JVM上的对象的方法。这是一种...

    使用RMI远程连接JVM.用JMX获取JVM的参数

    "Hello.java"和"HelloWorld.java"可能是示例类,用于演示RMI和JMX的使用。它们可能包含了简单的远程方法,或者展示了如何创建和注册MBean。 为了实现远程连接JVM并获取JVM参数,首先需要在服务器端启动JMX服务,并...

    RMI基础代码小程序

    在"rmi_helloworld"这个小程序中,可能包含了以下步骤: 1. 定义一个远程接口,声明远程方法。 2. 创建实现远程接口的类,并实现远程方法。 3. 在服务器端启动RMI注册表,将远程对象导出并注册到注册表中。 4. 在...

    Dubbo入门之HelloWorld

    本文将基于"Dubbo入门之HelloWorld"的主题,深入探讨如何从零开始学习并实践Dubbo的基本用法。 首先,我们需要了解什么是RPC(Remote Procedure Call)。RPC是一种使程序可以调用另一个系统中的函数或方法的技术,...

    RMI可执行的简单源码

    Java Remote Method Invocation (RMI) 是Java平台上的一个特性,它允许分布式系统中的对象调用彼此的方法,即使这些对象位于不同的 JVM(Java Virtual Machine)上。这个技术在开发分布式应用程序时非常有用,尤其是...

    Java RMI详细介绍及简单实例

    Java RMI(Remote Method Invocation)是Java平台提供的一种用于实现分布式计算的技术。它允许一个Java对象在一台机器上(客户端)调用另一台机器上(服务器端)对象的方法,仿佛这些方法是在本地对象上调用一样。...

Global site tag (gtag.js) - Google Analytics