`
xuyuanshuaaa
  • 浏览: 387702 次
  • 性别: 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】

    NULL 博文链接:https://gaojingsong.iteye.com/blog/2341692

    RMI规范 RMI详细介绍

    RMI 规范 RMI 详细介绍 共10章

    java rmi详细介绍介绍

    java rmi详细介绍介绍java rmi详细介绍介绍java rmi详细介绍介绍java rmi详细介绍介绍

    rmi接口技术详细介绍文档

    一份很全的介绍rmi基本原理,以及如何使用rmi,以及使用过程中需要注意的事项,非常不错的文档

    Weblogic Server与RMI

    Weblogic Server与RMI RMI的使用介绍

    java rmi详细介绍.doc

    java rmi详细介绍

    Spring Rmi使用文档

    Spring Rmi的使用,对Spring RMI进行全访问的介绍,并介绍了其中的源代码部分

    rmi 例子和详细介绍的ppt

    rmi 详细介绍 和 web应用实例(包含rimserver和rmiclient两个工程)

    rmi入门学习,实用的小例子

    描述java rmi的实用方式,有实用简单的入门介绍,很容易理解!!!

    JDK5新版RMI编程指南

    JDK5中,RMI技术已经得到了重大更新。现在使用JDK提供的RMI类,可以相当简单的发布RMI服务! 在JDK5发布之前,使用RMI是一件非常繁琐的事情。甚至很多程序员把EJB... 本文详细介绍了怎样使用JDK5新版的RMI进行开发!

    RMI:远程方法调用(RMI)简介

    RMI介绍该项目最初是作为在2015年秋季的Java课程中在Java中使用RMI的示例项目而编写的。安装$ mvn install$ java -Djava.security.policy=RMI-Server/server.policy -jar RMI-Server/target/RMI-Server-1.0.jar$ ...

    乳化液泵站RMI与KAMAT比较分析

    介绍了目前国内市场占有率较高的KAMAT泵站和RMI泵站的整体结构,从减速系统、液力系统、润滑系统、保护系统、控制系统等方面对其关键技术进行了全面的比较和分析,总结了各自的优缺点,并指出各自的改进方向:对于...

    RMI.rar_rmi

    这是一篇介绍RMI的入门性文档,里面包含了几个简单例子,对于入门有很大的帮助

    JAVA RMI规范

    详细介绍了JAVA RMI 的知识,不可多得的文档。长达60页,很详尽。对于java远程调用和分布式开发很有帮助。

    Java RMI详细介绍及简单实例

    主要介绍了Java RMI详细介绍及简单实例的相关资料,需要的朋友可以参考下

    rmi原理-chn-pdf

    rmi原理介绍及介绍,适合重新温习,中文版pdf

    rmi:RMI - 数据传输

    介绍 该项目允许您操作通过 RMI 分布的对象。 RMI 允许您在多个虚拟机之间共享资源(对象)。 建筑学 UML图 脚本 姓 描述 树_1.sh 模拟一个 6 节点树。 消息由节点 1(根)初始化。 树_2.sh 同上,只是消息由...

    rmi.rar_Java CORBA_corba_rmi

    分别介绍RMI,分布式对象与CORBA,动态接口,CORBA客户端开发的课件,以及相关的例子

Global site tag (gtag.js) - Google Analytics