`

RMI分布式调用

    博客分类:
  • RMI
RMI 
阅读更多

14.4.1 RMI

介绍

 

RMI

Remote 

Method 

Invocation

(远程方法调用)的

 

所写。它允许一个

Java

程序调

用网络中另一台计算机上的

Java

方法,就如调用本机的方法一样。实现

RMI

调用的程序和

被调用的方法,都必须是

Java

代码,即客户端和服务器端都必须通过纯

Java

实现。

 

RMI

是基于

Java

的分布式编程模型,

使用

RMI

进行远程方法调用时,

无须考虑方法底

层的网络传输细节。

 

 

 

要使用

RMI

,必须构建四个主要的类:远程对象的本地接口、远程对象实现、

RMI

客户机和

RMI

服务器。

RMI

服务器生成远程对象实现的一个实例,并用一个专有的

URL

注册。

RMI

客户机在远程

RMI

服务器上查找服务对象,并将它转换成本地接口类型,然后

像对待一个本地对象一样使用它。

 

下面使用

RMI

的示例程序:

 

 

1

、先编写

RMI

服务器端(接口)

 

RMI

需要通过远程接口提供服务。也就是说,所有想被客户机调用的方法都必须在

Remote

接口里声明,否则无法完成调用。远程接口如下:

 

 

package

 cn.ac.ict.rmi; 

 

import

 java.rmi.Remote; 

import

 java.rmi.RemoteException; 

 

public

 

interface

 Server 

extends

 Remote  

    

//

所有在

Remote

接口里声明的方法都必须抛出

RemoteException

异常

 

 

    String helloWorld(String name) 

throws

 RemoteException; 

    Person getPerson(String name,

int

 age)

throws

 RemoteException; 

}

 

注意:

 

1

 

远程接口必须继承

java.rmi.Remote

接口。

 

2

 

远程接口里声明的方法会通过网络传输,而网络是不可靠的,因此,所有的远程方

法都必须抛出

RemoteException

 

3

 

RMI

服务是典型的面向接口编程,

只有在远程接口里定义的方法才会作为远程服务。

 

 

2

、接口实现类

 

 

远程服务提供类必须实现远程接口,并继承

java.rmi.server.UnicastRemoteObject

对象,继承

该类能提供远程服务。

 

package

 cn.ac.ict.rmi; 

 

import

 java.rmi.RemoteException; 

import

 java.rmi.server.UnicastRemoteObject; 

 

//

远程服务类,远程服务类必须继承

UnicastRemoteObject

,并实现

Remote

接口

 

 

public

 

class

 

ServerImpl 

extends

 

UnicastRemoteObject 

implements

 

Server 

{

 

 

 

//

远程服务类必须拥有构造器,且构造器必须抛出

RemoteException

异常

 

 

public

 ServerImpl()

throws

 RemoteException { 

 

 

super

(); 

 

 

//

实现

Remote

接口必须实现的方法

 

    

public

 String helloWorld(String name)

throws

 RemoteException { 

 

          

return

 name + 

", 

您好

!"

    } 

    

//

实现

Remote

接口必须实现的方法

 

    

public

 Person getPerson(String name,

int

 age)

throws

 RemoteException 

           

return

 

new

 Person(name,age); 

 

    } 

    

//

下面是服务类的本地方法,不会提供为远程服务。

 

    

public

 

void

 info() { 

     

S

ystem.

out

.println(

"I am a Local Method "

); 

 

3

RMI

服务器类

 

package

 cn.ac.ict.rmi; 

 

import

 java.rmi.Naming; 

import

 java.rmi.registry.LocateRegistry; 

 

public

 

class

 HelloServer { 

 

 

 

public

 

static

 

void

 main(String[] args) { 

 

 

try

 

 

 

System.

out

.println(

"Start RMI servering..."

); 

     

 

//

创建远程服务类实例

 

            Server imp = 

new

 ServerImpl(); 

            

//

注册远程服务的端口

 

            LocateRegistry.

createRegistry

(1099); 

            

//

将远程服务实例绑定为远程服务。

 

            Naming.

rebind

(

"rmi://168.160.194.155:1099/aa"

, imp); 

            System.

out

.println(

"Waiting client invoke..."

); 

     

}

catch

(Exception e){ 

     

 

e.printStackTrace(); 

     

}

 

 

 

}

 

将两个编辑好的源文件存盘,然后编译。

 

 

注册远程服务端口:

 

LocateRegistry.

createRegistry

(1099); 

1099

RMI

服务的默认端口。然后执行如下代码绑定远程服务

 

Naming.

rebind

(

"rmi://168.160.194.155:1099/aa"

, imp); 

 

注意:

1

、如果一个类继承自

UnicastRemoteObject

,那么它必须提供一个构造函数并且声明

抛出一个

RemoteException

对象,即使找个构造器什么都不做。当这个构造函数调用了

super()

它就激活

UnicastRemoteObject

中的代码完成

RMI

的连接和远程对象的初始化。

 

2

、这种在程序中直接注册的方式(不使用

rmiregistry.exe

工具)

,不必再使用

rmic

令编译服务类生成

stub

类:在类的根目录下运行

rmic

命令,且类包含完整的包名:

 

bin> rmic cn.ac.ict.rmi.ServerImpl 

 

4

、客户端

 

 

客户端程序面向接口编程,客户端部分需要

Server

接口的

class

文件,还需要

stub

文件。客

户端的源代码如下:

 

package

 cn.ac.ict.rmi; 

 

import

 

 java.rmi.Naming; 

import

 java.rmi.RMISecurityManager; 

 

public

 

class

 RMIClient { 

    

public

 

static

 

void

 main(String[] args)

throws

 Exception { 

     

 

//     

//

安全管理器类

RMISecurityManager.

这是因为

RMI

需要传递对象并进行动态类

装入,所以必须加载安全管理器以防止别人发送伪类

 

//        

if(System.getSecurityManager() == null) {      

 

 

//            

 

//             

System.setSecurityManager(new RMISecurityManager());

 

//            }

 

        

try

     

/

/

通过

JNDI

查找远程服务

 

     

S

erver ser = (Server)Naming.

lookup

(

"rmi:// 

168.160.194.155:1099/aa"

); 

     

/

/

调用远程方法

 

     

S

ystem.

out

.println(ser.helloWorld(

"cuixingchen"

)); 

     

/

/

调用远程方法。

 

     

S

ystem.

out

.println(ser.getPerson(

"cuixingchen"

,28)); 

        }

catch

(Exception e){ 

         

e.printStackTrace(); 

        } 

    } 

 

 

 

上面注释了安全管理的代码,如果把注释去掉,那么需要建立一个安全策略文件。

 

从客户端程序看,无法感受到

Server

的实现在远端。程序调用

Server

实例方法时,与平常

调用方法只有非常细微的区别:调用远程方法必须抛出

RemoteException

 

 

再看远程方法的返回值,

helloWorld

的返回值是

String

,而

getPerson

的返回值则是

Person

对象。

远程方法的返回值必须有一个要求:实现

Serializable

接口

。因为远程的方法的参数、

返回值都必须在网络上传输,网络只能传输字节流,因此,要求参数、返回值都可以转换成

字节流——即实现序列化。

 

 

客户端使用

JNDI

查找,查找远程服务名。将远程服务对象类型转换成远程接口类型,客户

端面向接口编程。

RMI

的具体实现,依然是依赖于底层的

Socket

编程。

RMI

依赖于

TCP/IP

传输协议,服务器端

skeleton

建立

ServerSocket

监听请求,而客户端建立

Socket

请求连接。

RMI

实现了网络传输的多线程、

IO

等底层细节。这些细节的实现就隐藏在

rmic

命令的执行

中:使用

rmic

命令编译时生成的

class

文件:

 

 

stub

:该文件用于与客户端交流,建立

Socket

请求连接。

 

skeleton

用于与服务器端交流,建立

ServerSocket

监听请求。

分享到:
评论

相关推荐

    EX3_RMI分布式议程服务_principalk7z_

    在这个"EX3_RMI分布式议程服务_principalk7z_"项目中,我们看到的是一个利用RMI构建的分布式议程服务。这样的服务可以让多个用户跨网络共享和管理他们的会议日程。 首先,我们要理解RMI的基本原理。RMI允许一个Java...

    RMI分布式议程服务

    总的来说,这个"RMI分布式议程服务"示例提供了一个学习和实践RMI的实用案例,涵盖了分布式系统的基础操作,如远程对象注册、调用以及日程管理业务逻辑的实现。对于深入理解Java RMI技术,以及如何构建分布式应用程序...

    spring和RMI分布式整合源码

    这个“spring和RMI分布式整合源码”可能包含了一个实际项目中如何将这两种技术融合的实例。现在,我们将深入探讨Spring框架和RMI,以及它们在分布式环境中的整合应用。 首先,Spring是一个开源的Java应用程序框架,...

    RMI分布式会议系统

    **RMI分布式会议系统**是一种基于Java Remote Method Invocation (RMI) 技术构建的软件应用,用于在分布式环境中实现高效的会议管理和协作。RMI允许Java对象在不同的JVM(Java虚拟机)之间进行交互,使得多台计算机...

    基于RMI分布式会议系统

    【基于RMI分布式会议系统】是一种使用Java Remote Method Invocation(远程方法调用)技术构建的分布式应用程序,旨在模拟和管理虚拟会议。RMI是Java提供的一种机制,它允许在不同的Java虚拟机(JVM)之间透明地调用...

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

    基于Java—RMI分布式技术的应用研究 1. RMI概述 RMI(Remote Method Invocation)是Java语言中的一种分布式技术,允许在不同的地址空间中通信的对象之间进行远程调用。RMI提供了一种机制,使服务器端和客户端之间...

    关于java RMI分布式程序开发实例

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于构建分布式应用程序的技术。它允许Java对象在不同的 JVM(Java虚拟机)之间进行交互,仿佛它们是在同一个内存空间内一样。这个实例将带...

    分布式 RMI远程调用

    分布式RMI(Remote Method Invocation)远程调用是一种在分布式系统中实现对象间通信的技术,它允许一个对象在某个进程中调用另一个位于不同进程或者不同计算机上的对象的方法,从而实现跨网络的对象交互。...

    基于RMI 的分布式议程服务

    远程方法调用(Remote Method Invocation,RMI)是Java平台中用于实现分布式计算的一种技术。它允许在不同的Java虚拟机(JVM)之间进行对象方法的调用,使得开发分布式应用程序变得更加简单。在本项目中,我们构建了...

    JavaRMI分布式编程心得

    ### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...

    Java RMI分布式编程实例

    在这个"Java RMI分布式编程实例"中,我们将深入探讨RMI的基本概念、工作原理以及如何通过实例来掌握其关键特性。 1. **RMI基本概念** - **远程接口(Remote Interface)**:定义了远程对象的方法签名,它是客户端...

    eclipse RMI分布式注册查询程序

    在“eclipse RMI分布式注册查询程序”中,Eclipse是一个集成开发环境(IDE),用于编写、调试和运行Java项目。RMI的核心概念包括以下几个部分: 1. **远程接口(Remote Interface)**:这是定义远程方法的Java接口...

    RMI分布式消息传送模型.doc

    在RMI分布式消息传送模型中,这一技术被应用于构建一个商业消息传送平台,该平台由消息传送模块和业务模块组成。 消息传送模块是基于RMI的核心部分,负责实现纯Java消息的分布式通信。它采用集中式体系结构,主要...

    一个RMI的分布式应用的实例

    ### RMI分布式应用实例解析 #### 一、RMI简介及分布式应用原理 RMI (Remote Method Invocation) 是 Java 提供的一种远程方法调用技术,它允许开发者在不同的 JVM 上像调用本地方法那样调用远程方法。RMI 的主要...

    java分布式之RMI简介及实例

    远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算框架,它允许开发者创建可以在网络上跨多台计算机运行的对象。RMI的目标是使得网络上的对象能够像本地对象一样被调用,从而简化了...

    Java RMI分布式系统应用研究.pdf

    Java RMI(Remote Method Invocation,远程方法调用)是Java开发网络分布式应用系统的一个重要框架。RMI框架的出现,使得开发人员可以更方便地进行分布式系统的开发。RMI通过提供透明的远程调用机制,允许Java程序...

    分布式调用RMI例子程序

    分布式调用RMI(Remote Method Invocation)是Java平台上的一个重要特性,它允许Java对象在不同的JVM(Java Virtual Machine)之间进行远程方法调用,从而实现分布式系统的构建。在这个"分布式调用RMI例子程序"中,...

    利用RMI异步调用

    在IT行业中,远程方法调用(Remote Method Invocation, RMI)是Java平台提供的一种机制,允许在不同的Java虚拟机之间进行分布式计算。RMI使得一个Java对象能够像调用本地方法一样调用远端对象的方法,极大地扩展了...

Global site tag (gtag.js) - Google Analytics