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

RMI介绍

 
阅读更多
Java RMI (Remote Method Invocation)
Java RMI是一种机制, 是能够让一个 java虚拟机 调用 另一个java 虚拟机上对象的方法, 从而实现远程访问.
但是通过客户端实现该远程访问 必须绑定一个远程接口对象.
RMI可以称作不同jvm间的访问协议。

定义远程接口

首先 我们写个远程接口 HelloInterface 该接口继承了远程对象Remote

接口HelloInterface 里面有个sayHello的方法  用于客户端连接后 打招呼

由于sayHello方法  继承了远程Remote对象  所以需要抛一个 RemoteException 远程异常。
package Remote_Interface;

import java.rmi.Remote;
import java.rmi.RemoteException;
/**
 * 接口HelloInterface 继承了 远程接口 Remote 用于客户端Client远程调用
 */
public interface HelloInterface extends Remote{
    
     public String sayHello(String name) throws RemoteException; 
}

实现接口(实现接口在服务端)

接下来 我们实现下 该接口里的方法 实现接口的方法在服务端

通过  HelloInterfaceImpl类 实现了接口HelloInterface里的方法

注意: 这里HelloInterfaceImpl 同样继承了 UnicastRemoteObject 远程对象 这个必须写 虽然不写 代码智能提示不会提示有错  但服务器启动后会报错,但通过实现serialize接口可以解决启动问题,但是客户端conncetion refused 无法解决。并如需要对象则对象须实现serializate借口,完成对象传输

由于 UnicastRemoteObject 远程对象 需要抛出一个RemoteException 异常  所以 这里用了一个构造方法 HelloInterfaceImpl() 来抛这个异常。
package Server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import Remote_Interface.HelloInterface;
/**
 * HelloInterfaceImpl 用于实现 接口HelloInterface 的远程 SayHello方法
 */
@SuppressWarnings("serial")
// 继承 UnicastRemoteObject 远程对象    这个一定要写 否则 服务器启动报异常
public class HelloInterfaceImpl extends UnicastRemoteObject implements HelloInterface{
    
    //HelloInterfaceImpl的构造方法 用于抛出UnicastRemoteObject 远程对象里的异常
    protected HelloInterfaceImpl() throws RemoteException {
    }

    public String sayHello(String name) throws RemoteException {
        //该信息 在客户端上发出
        String strHello = "你好! " + name+" 欢迎访问服务器!";
        //这条信息 是在服务器上 打印出来
        System.out.println(name +" 正在 访问本服务器!");
        return strHello;
    }
    
}

编写服务端

接下来 我们来写 服务端  由于RMI 实现远程访问的机制是指 客户端通过在RMI注册表上寻找远程接口对象的地址(服务端地址) 达到实现远程访问的目的

所以这里 我们需要在 服务端 创建一个远程对象的注册表   用于绑定和注册 服务器端地址和远程接口对象 便于后期客户端能够成功找到服务端 (详细请看代码注释)
package Server;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import Remote_Interface.HelloInterface;

/**
 * Server 类 用于 启动 注册服务器
 */
public class Server {

    public static void main(String[] args) {
        try {
            // 定义远程接口HelloInterface 对象 用于绑定在服务器注册表上 该接口由HelloInterfaceImpl()类实现
            HelloInterface hInterface = new HelloInterfaceImpl();
            int port = 6666; // 定义一个端口号
            // 创建一个接受对特定端口调用的远程对象注册表 注册表上需要接口一个指定的端口号
            LocateRegistry.createRegistry(port);
            // 定义 服务器远程地址 URL格式
            String address = "rmi://localhost:" + port + "/hello";
            // 绑定远程地址和接口对象
            Naming.bind(address,hInterface);
            
            // 如果启动成功 则弹出如下信息
            System.out.println(">>>服务器启动成功");
            System.out.println(">>>请启动客户端进行连接访问");
        } catch (MalformedURLException e) {
            System.out.println("地址出现错误!");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            System.out.println("重复绑定了同一个远程对象!");
            e.printStackTrace();
        } catch (RemoteException e) {
            System.out.println("创建远程对象出现错误!");
            e.printStackTrace();
        }

    }

}

编写客户端

服务器写完了 我们来写下访问服务器需要的客户端

客户端上同样 需要定义一个 远程访问的地址 - 即服务器地址

然后 通过在RMI注册表上寻找 该地址;  如果找到 则建立连接。
package Client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import Remote_Interface.HelloInterface;

/**
 * Client 用于连接 并访问 服务器Server
 */
public class Client {

    public static void main(String[] args) {
        // 定义一个端口号 该端口号必须与服务器的端口号相同
        int port = 6666;
        // 同样定义一个远程地址 该地址为服务器的远程地址 所以 与服务器的地址是一样的
        String address = "rmi://localhost:" + port + "/hello";

        // 在RMI注册表上需找 对象为HelloInterface的地址 即服务器地址 
        try {
            HelloInterface hInterface = (HelloInterface) Naming.lookup(address);
            // 一旦客户端找到该服务器地址 则 进行连接
            System.out.println("<<<客户端访问成功!");
            //客户端 Client 调用 远程接口里的 sayHello 方法  并打印出来
            System.out.println(hInterface.sayHello("SoFlash")); 
            
        } catch (MalformedURLException e) {
            System.out.println("错误的地址!");
            e.printStackTrace();
        } catch (RemoteException e) {
            System.out.println("创建远程对象出错!");
            e.printStackTrace();
        } catch (NotBoundException e) {
            System.out.println("未绑定的远程对象!");
            e.printStackTrace();
        }

        

    }
}
分享到:
评论

相关推荐

    【Java RMI介绍以及编写Demo】

    下面将详细介绍Java RMI的基本概念、工作原理以及如何编写一个简单的RMI示例。 ### RMI基本概念 1. **远程对象(Remote Object)**:在RMI中,远程对象是实现了特定接口的Java对象,这个接口被称为远程接口...

    RMI-IIOP.zip_The Client_rmi iiop

    **RMI介绍** RMI是Java中用于在不同JVM之间调用方法的机制。它允许对象在不同的网络节点上分布,提供了一种透明的方式来调用远程对象的方法,仿佛它们就在本地一样。RMI的核心概念包括:远程接口、远程对象、注册表...

    java rmi详细介绍介绍

    ### Java RMI 详细介绍 #### 一、Java RMI 概念 Java远程方法调用(Java Remote Method Invocation,简称 Java RMI)是一种允许在一台机器上的Java对象通过网络调用另一台机器上的对象的方法的技术。它为Java开发...

    rmi接口技术详细介绍文档

    **RMI接口技术详解** RMI(Remote Method Invocation),即远程方法调用,是Java平台中用于实现不同Java虚拟机间对象通信的技术。RMI的目标是使得分布在网络上的对象能够像本地对象一样工作,实现位置透明性,隐藏...

    Synaptics_RMI3_Specification.zip_RMI3_Synaptics_rmi4_s3508 _spec

    在“Synaptics_RMI3_Specification.pdf”文档中,详细介绍了S3508的硬件架构,包括传感器阵列、信号处理单元和接口模块。其中,传感器阵列部分详细描述了触控感应器的工作原理和配置;信号处理单元则涵盖了数据采集...

    分布式实验报告RMI.docx

    本实验报告主要介绍了 Java RMI(Remote Method Invocation,远程方法调用)的基本概念和实现步骤。RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。 ...

    java_rmi文档

    本文档详细介绍了RMI的使用方法和工作机制,并配以丰富的实例进行讲解。 1. **RMI基本概念** - **远程对象**:在远程服务器上的对象,可以通过网络调用其方法。 - **接口**:定义远程对象需要实现的公共方法,...

    rmi_java项目实例

    本项目实例是基于RMI技术实现的一个服务器端程序,名为"RMIServer",提供了远程服务的接口和实现,下面将详细介绍RMI的基本概念、工作原理以及如何通过这个项目实例来学习和应用RMI。 1. **RMI基本概念**: - **...

    Weblogic Server与RMI

    Weblogic Server与RMI RMI的使用介绍

    RMI-IIOP 基于SUN

    这篇文章将详细介绍RMI-IIOP的基本概念、工作原理及其在实际应用中的价值。 RMI是Java中的一种机制,允许一个Java对象调用另一个在网络中不同 JVM(Java虚拟机)上运行的对象的方法。RMI-IIOP则是在RMI的基础上添加...

    Synaptics RMI4 Specification

    《Synaptics RMI4 Specification》是一份详细介绍Synaptics RMI4技术标准的文档,该文档提供了关于如何使用Synaptics RMI4硬件接口的所有必要信息。Synaptics RMI4(Relay Module Interface)是一种用于触控板和触摸...

    java_in_rmi.rar_Java RMI_RMI java_rmi _精通rmi

    1. RMI基础知识:解释RMI的概念,介绍其工作原理,包括客户端和服务端的角色。 2. 创建远程接口:讲解如何定义远程接口,它是远程方法调用的合同。 3. 实现远程对象:介绍如何实现远程接口,并创建远程对象实例,...

    java rmi详细介绍.doc

    java rmi详细介绍

    synaptics s3202 寄存器手册以及RMI4手册

    这两个手册详细介绍了Synaptics公司的S3202芯片以及RMI4(Remote Mouse Interface 4)协议的运作机制。 S3202是一款由Synaptics公司生产的高性能触控芯片,广泛应用于各种触摸屏设备,如智能手机、平板电脑等。...

    JAVA RMI.rar_Java RMI_ME_RMI java_rmi

    在"JAVA RMI.rar"中,"www.pudn.com.txt"可能包含了关于RMI的额外信息,比如项目的介绍、代码示例或者使用说明。而"JAVA RMI"文件可能是一个包含RMI实现的Java类库,或者是演示RMI功能的可执行程序。通过阅读"read ...

    RMI.rar_rmi

    1. "Readme.txt"通常包含关于压缩包的使用指南或者简要介绍,可能概述了RMI的基本原理、配置步骤,或者异步消息处理和回调机制的实践示例。 2. "www.pudn.com.txt"可能是从网站pudn.com下载的资源,可能包含了与RMI...

    Eclipse RMI插件使用API

    本文将详细介绍如何在Eclipse环境中设置并使用RMI插件来开发RMI应用程序。 #### 二、安装与配置RMI插件 1. **下载插件**:访问[官方文档](http://www.genady.net/rmi/v16/index.html?/rmi/v16/main.html&MAIN16)...

Global site tag (gtag.js) - Google Analytics