`
youyu4
  • 浏览: 440447 次
社区版块
存档分类
最新评论

代理模式 -- java RMI 实现远程服务 -- 转

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

相关推荐

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    Java RMI中文规范

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台中用于构建分布式对象系统的关键技术。它允许Java应用程序在不同Java虚拟机(JVM)之间进行远程方法调用,这些虚拟机可能位于同一台计算机或网络上的...

    分布式环境下Java RMI与RPC,JMS,CORBA,DCOM的比较

    - **RMI**:是Java平台上实现远程方法调用的技术。 2. **特点**: - DCOM主要针对Windows平台,而RMI则适用于所有支持Java的平台。 - DCOM支持多种通信协议,如DCERPC等。 3. **使用场景**: - DCOM通常用于...

    JavaRMI.pdf

    在Java RMI中,远程对象需要实现一个远程接口(Remote Interface),该接口扩展自java.rmi.Remote接口。远程接口中声明的方法需要抛出java.rmi.RemoteException。开发者需要创建一个远程对象类,该类继承自...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    java Spring+RMI入门程序源代码

    1. **RMI 概念**:RMI 是 Java 平台中的一种标准机制,允许一个 Java 对象调用远程计算机上的另一个 Java 对象的方法,实现远程过程调用。 2. **RMI 组件**:RMI 包括三个主要部分:远程接口(Remote Interface)、...

    代理模式Remote Proxies(三、RMI)

    9. **RMI与EJB**:虽然RMI是基础,但更高级的Java企业版(Java EE)中的Enterprise JavaBeans(EJB)也利用了RMI技术来实现远程方法调用,但EJB提供了更多的服务,如事务管理、安全性、生命周期管理和并发控制。...

    java RMI 总结

    Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,它允许Java对象在不同的JVM(Java Virtual Machine)之间进行远程调用。RMI是构建分布式应用程序的基础,尤其适用于那些需要跨越网络进行...

    java API文档

    - **java.rmi.activation**:支持激活ID管理等远程服务功能。 - **java.rmi.dgc**:提供了与RMI相关的数据管理功能。 - **java.rmi.registry**:注册表服务支持。 - **java.rmi.server**:服务器端RMI支持。 - ...

    东北大学程序实践三(多线程、服务器、RMI)

    理解RMI的核心机制,如序列化、远程对象的代理模式和异常处理,对于实现远程服务调用至关重要。 【实验文件】: - "实验一.doc"可能涵盖了多线程的基本概念和实践,包括如何创建线程、同步机制的应用以及线程通信等...

    (超赞)JAVA精华之--深入JAVA API

    **3.5 JavaMail(JAVA邮件服务)API详解** - **邮件发送** - 使用 JavaMail 发送电子邮件。 **3.6 jxl.jar 包简介** - **Excel操作** - 使用 jxl.jar 处理 Excel 文件。 **3.7 Java与XML联合编程之SAX篇** - ...

    代理模式简介和java代码实现

    代理模式在 Java 中的应用非常广泛,它可以用来实现多种功能,如: 1. **远程代理**:当客户端和目标对象位于不同的网络或者进程时,代理可以作为远程调用的桥梁。例如,RMI (Remote Method Invocation) 和 JAX-RPC...

    rmi原理-chn-pdf

    RMI(Remote Method Invocation,远程方法调用)是一种Java平台上的技术,它允许开发者在不同JVM间的对象间进行方法调用,就像是本地方法调用一样简单。这项技术的出现极大地简化了分布式系统的开发工作,并成为了...

    JAVA设计模式在JDK中的应用

    - RMI (Remote Method Invocation): 远程方法调用机制。 ### 创建型模式 创建型模式关注于对象的创建机制,这些模式尝试在创建新对象时提供一定的灵活性。 #### 8. 抽象工厂模式(Abstract Factory) 抽象工厂模式...

    基于Java—RMI分布式技术的应用研究.pdf

    RMI采用三层体系结构,基于C/S模式进行通信,并采用代理来进行客户端和远程对象之间的通信。RMI作为一种远程对象,可以生成客户端和服务器端代理,客户端的代理类叫做存根(Stub),服务器端的代理类叫做骨架...

    J2EE与设计模式--

    - **代理模式**:用于实现远程方法调用(RMI)或安全性控制,如EJB的远程接口。 - **装饰器模式**:允许在不改变类结构的基础上添加新功能,如JDBC连接池的实现。 - **观察者模式**:在事件驱动的系统中,如JMS...

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    java代理模式

    Java代理模式是一种设计模式,它在对象交互的过程中起到了中介的作用,允许我们在不修改原有对象的基础上,为对象添加新的功能或控制其...此外,代理模式也常用于远程方法调用(RMI)、事件处理、缓存策略等多种场景。

    Remote Method Invocation-远程方法调用

    2. **远程服务接口的具体实现**: 实现远程接口的服务对象。 3. **桩(Stub)和框架(Skeleton)文件**: Stub作为客户端访问远程对象的代理,而Skeleton处理服务器端的请求。 4. **运行远程服务的服务器**: 承载远程...

Global site tag (gtag.js) - Google Analytics