`
Technoboy
  • 浏览: 156701 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java RMI (1)

    博客分类:
  • J2SE
阅读更多
1. Java RMI
Java Remote Method Invocation(Java远程方法调用)允许程序员创建分布式Java技术为基础的应用,可以调用不同JVM远程对象上的远程方法。RMI使用对象序列化去marshal(编码),unmarshal(解码)参数进行,不截断类型,支持面向对象的多态性。

2. Stub


  RMI相当于一个代理模式。客户对象想要调用远程服务对象上的远程方法,我们需要一些辅助对象。这些辅助的对象使客户就像在调用本地对象的方法一样。客户对象调用客户辅助对象上的方法,仿佛客户辅助对象就是真正的服务。而客户辅助对象负责为我们转发这些请求,但是客户辅助对象不是真正的远程服务。虽然操作很像,但是不具有真正远程服务对象的方法逻辑。在服务端,服务辅助对象从客户辅助对象中接受请求,将调用的信息解包,然后调用真正服务对象上的真正方法。服务辅助对象从服务中得到返回值,将它打包,然后返回客户辅助对象,客户服务对象对信息解包,最后将返回值交给客户端。
  Stub(存根)就相当于这里的客户辅助对象。存根将所需要的参数进行编码后传递给远程方法,并将调用结果或者异常传递给客户端。从JDK1.5开始,存根类可以采用动态代理的方式自动生成。在这之前,必须使用rmic工具手动创建。

3. java.rmi.Remote
  3.1 扩展java.rmi.Remote接口
    Remote是一个标记接口,没有任何方法,所有远程服务对象必须间接或者直接的扩展Remote接口。由于远程服务对象可以被其他的JVM调用,所有可以实现一个或多个远程接口。如果远程服务对象被同时的访问,必须在其实现中保证线程的安全。
  
   public interface MyRemote extends java.rmi.Remote{}

   3.2 接口声明中的所有方法都将抛出RemoteException异常。
     客户调用远程接口的stub上的方法,而stub底层调用了网络和I/O,所以可能会发生各种异常,所以必须声明远程异常来解决。java.rmi.RemoteException继承自java.io.IOException。
  
   public interface MyRemote extends Remote{
      public String sayHello() throws RemoteException;
    }

   3.3 远程方法的变量和返回值必须是原语类型或者是可序列化类型。
     这不难理解,因为远程方法的变量必须被打包并通过网络发送。(所以,在传送自己定义的类时,必须保证实现Serializable接口)

4. java.rmi.RemoteException
  RemoteException继承自java.io.IOException。它是一个检查型异常,通常用来标识:通信失败、远程调用参数/返回值在编码(marshalling)/解码(unmarshalling)过程中出错,协议错误。

5. java.rmi.server.RemoteObject


  RemoteObject类实现远程对象的java.lang.Object 行为,并提供了远程对象默认的hashCode、equals 和 toString 方法实现。创建远程对象并将其导出(使远程对象具有某些"远程的"功能)所需的方法由类UnicastRemoteObject 和 Activatable 提供。

6. java.rmi.registry.Registry
  Registry是简单远程对象注册表的一个远程接口(默认的端口号为1099
),它提供绑定和查找的功能。其内部维护了一个名到对象的映射。LocateRegistry 用于获得对特定主机(包括本地主机)上引导远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。 注意,getRegistry 调用并不实际生成到远程主机的连接。它只创建对远程注册表的本地引用,即便远程主机上没有正运行的注册表,它也会成功创建一个引用。LocateRegistry.createRegistry()方法在本机指定的端口上创建并发布一个registry远程对象。

7. 示例程序:
  7.1 定义远程接口
public interface MyRemote extends Remote {
	public String sayHello() throws RemoteException;
}

  7.2 实现远程接口
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{

	private static final long serialVersionUID = -3510887331988311760L;

	protected MyRemoteImpl() throws RemoteException {
	}  //这里必须抛出RemoteException异常,因为超类会抛出这个异常

	@Override
	public String sayHello() throws RemoteException {
		return "server say hello to client";
	}
}


  7.3 用RMI Registry注册此服务
  
  public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{

	private static final long serialVersionUID = -3510887331988311760L;

	protected MyRemoteImpl() throws RemoteException {
	}

	@Override
	public String sayHello() throws RemoteException {
		return "server say hello to client";
	}
	
	public static void main(String[] args) {
		try {
			MyRemote remote = new MyRemoteImpl();
			Naming.bind("myRemoteServer", remote);
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			e.printStackTrace();
		}
		
	}
}

当注册这个实现对象时,RMI系统实际注册的是stub。

   7.4 客户端定义
public class Client {
	public static void main(String[] args) {
		try {
			MyRemote remote = (MyRemote)Naming.lookup("rmi://127.0.0.1/myRemoteServer");
			System.out.println(remote.sayHello());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
		
	}
}


启动:
  1. 启动remiregistry服务(位于Java\jdk1.6.0_18\bin,启动的目录必须为你workspace的bin目录)
rmiregistry -J-Djava.rmi.server.codebase=file:/D:/FXworkspace/rmi/bin/

  2. 执行MyRemoteImpl
  3. 执行Client

结果输出:
server say hello to client    
 
工作方式:


  1)客户到RMI registry中寻找
  2)RMI registry返回stub对象。
  3)客户调用stub方法,就像stub是真正的服务对象一样。


注:rmic是JDK内的一个工具,用来为一个服务类产生stub和skeleton。rmic有一些选项可以调整,包括不要产生skeleton、查看源代码、甚至使用IIOP作为协议。
  • 大小: 24.6 KB
  • 大小: 19.2 KB
  • 大小: 27.5 KB
1
0
分享到:
评论

相关推荐

    基于JAVA RMI的聊天室

    **基于JAVA RMI的聊天室** Java Remote Method Invocation(RMI)是Java平台提供的一种用于在分布式环境中调用远程对象的方法。在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户...

    java RMI技术实现的网络聊天室

    1. **RMI概念**:RMI是一种基于对象的远程调用机制,它允许Java对象像调用本地方法一样调用远程对象的方法。RMI系统包括客户端和服务器两部分,客户端通过接口与服务器交互,服务器则提供具体实现。 2. **RMI架构**...

    java rmi java rmi

    根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...

    java RMI实现代码

    1. 只支持Java:RMI是Java特有的,跨语言支持较差。 2. 性能限制:由于Java的序列化和反序列化过程,对于大数据量的传输可能效率较低。 3. 网络故障恢复:RMI没有内置的故障恢复机制,需要开发者自行处理。 通过这...

    javaRMI反序列化漏洞验证工具

    1. **环境准备**:确保Java环境和必要的库已安装,并了解目标RMI服务的地址和端口。 2. **运行工具**:使用命令行运行`attackRMI.jar`,并指定目标RMI服务器的相关参数。 3. **分析结果**:根据工具返回的信息,判断...

    java_rmi.rar_RMI java_java.rmi

    1. **创建远程接口**:首先,你需要定义一个Java接口,该接口声明了可以被远程调用的方法。这些方法必须是public并且没有void返回类型,因为RMI会异步调用它们。 2. **实现远程接口**:然后,创建一个实现远程接口...

    java rmi 参考文档

    ### Java RMI (Remote Method Invocation) 概念与实践 #### 一、Java RMI简介 Java RMI(Remote Method Invocation)是一种允许调用不同Java虚拟机(JVM)上方法的机制。这些JVM可能位于不同的机器上,也可能在同一...

    JavaRMI快速入门

    Java Remote Method Invocation(Java RMI)是Java编程语言中用于在网络间进行远程对象调用的技术。它是Java平台的标准部分,允许程序员在分布式环境中调用对象的方法,就像它们在同一台计算机上一样。Java RMI对于...

    java RMI简单Demo

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行透明的交互。在Java RMI中,一个对象可以调用另一个位于不同JVM(Java虚拟机)...

    JavaRMI.pdf

    Java RMI(Remote Method Invocation)是Java编程语言中用于实现远程过程调用的一种技术。它允许运行在客户机上的程序调用位于远程服务器上的对象的方法,从而实现分布式计算。RMI的核心思想是通过接口隐藏底层网络...

    JavaRMI超棒书

    1. **序列化**:Java RMI依赖于Java序列化机制来处理远程对象的传递。序列化是将对象的状态转换为字节流的过程,以便在网络上传输或存储在磁盘上。反序列化则是将字节流恢复成对象状态的过程。 2. **线程管理**:在...

    RMI.rar_Java RMI_java.rmi_java.rmi.Remot_remote

    1. **定义远程接口**:首先,你需要创建一个继承自`java.rmi.Remote`的接口,声明你想在远程对象上调用的方法。这些方法通常抛出`java.rmi.RemoteException`,因为网络通信中可能出现的各种问题。 2. **实现远程...

    JAVA RMI简单例子

    1. `IRemoteInterface.java`: 定义了远程接口,其中包含若干远程方法。 2. `RemoteObjectImpl.java`: 实现了`IRemoteInterface`,提供了远程方法的具体实现。 3. `Server.java`: 在服务器端启动,实例化`...

    Java RMI 简单示例

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于分布式计算的技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法。这个简单的示例展示了如何创建一个基本的...

    javaRMI完整版.pdf

    1. 面向对象:RMI 可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。 2. 可移动属性:RMI 可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。 3. 安全:RMI 使用 Java ...

    JAVA RMI

    1. **远程对象(Remote Object)**:这是RMI的核心,它是一个实现了特定接口(继承自java.rmi.Remote)的对象,该接口中的方法声明抛出java.rmi.RemoteException。远程对象可以驻留在网络上的任何地方,并通过网络...

    Java RMI中文规范

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

    JAVA RMI测试代码

    1. **RMI基本概念**:理解RMI的核心在于远程接口(Remote Interface)和远程对象(Remote Object)。远程接口定义了可以在远程主机上执行的方法,而远程对象则是实现了这些接口的具体实例。 2. **注册与查找**:在...

    JAVA RMI.rar_Java RMI_ME_RMI java_rmi

    1. **RMI基本概念**:RMI的核心是远程接口,它定义了可以在远程对象上执行的操作。通过实现远程接口,开发者可以创建远程对象,这些对象可以在网络中的其他地方被调用,就像它们是在本地一样。 2. **远程对象注册**...

    java rmi HelloWorld版(源码)

    1. **远程接口(Remote Interface)**:这是定义远程方法的接口,需要继承`java.rmi.Remote`。远程接口中的方法声明抛出`java.rmi.RemoteException`,表示这些方法可能在网络通信中出现异常。 2. **远程对象...

Global site tag (gtag.js) - Google Analytics