Java中RMI的实现

本文介绍了Java中远程方法调用(RMI)的作用、调用过程,并通过实例展示了如何在Eclipse环境下进行RMI的开发和运行,包括创建远程接口、实现类和服务端与客户端的交互。同时提供了在命令行和Eclipse中运行RMI应用的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学习Java中的设计模式,在代理模式中有一种远程代理,它是通过RMI来实现的。

1、作用
RMI是通过网络使得本地对象能够方便地远程对象的方法,使得本地对象调用远程对象的方法跟调用本地对象的方法一样。

2、 调用过程
这里写图片描述
如上图,客户端中的客户对象调用服务端服务对象的方法A(),其过程是:
(1) 客户对象调用远程对象的方法A();
(2) 客户辅助对象将请求进行包装,通过网络发送到服务端的服务辅助对象;
(3) 服务辅助对象将请求进行解析,调用服务对象的A()方法;
(4) 得到返回值后,服务辅助对象将返回值进行包装,通过网络发送给客户辅助对象;
(5) 客户辅助对象收到后进行解释,最后将结果传给客户对象。
这就是远程方法调用的一个基本过程。客户对象并不知道其结果是通过网络请求服务对象才返回的结果,对于服务对象来时,这跟调用本地方法是一样的。

3、 实例
(1) 设计
MyRemoteImpl类是服务类,MyRemoteClient是客户类,它们都实现了共同的接口MyRemote。

(2) 源码
MyRemote类

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyRemote extends Remote
{
    public String sayHello() throws RemoteException;
}

MyRemoteImpl类

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote
{
    protected MyRemoteImpl() throws RemoteException
    {       
    }

    private static final long serialVersionUID = 1L;

    @Override
    public String sayHello()
    {
        return "Server say, Hey";
    }

    public static void main(String[] args)
    {
        try
        {       
            /*
             *注意,这里的10.6.11.127是我的服务端地址
             *端口8088是随便选的,只要现在没用其他程序使用该端口就行 
             */
            System.setProperty("java.rmi.server.hostname","10.6.11.127");           
            MyRemote servcie = new MyRemoteImpl();          
            LocateRegistry.createRegistry(8088);            
            Naming.rebind("//10.6.11.127:8088/RemoteHello", servcie);   

        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

MyRemoteClient类

import java.rmi.*;

public class MyRemoteClient
{
    public static void main(String[] args)
    {
        new MyRemoteClient().go();      
    }

    public void go()
    {
        try
        {           
            MyRemote service = (MyRemote) Naming.lookup("//10.6.11.127:8088/RemoteHello");          
            String s = service.sayHello();          
            System.out.println(s);          
        } catch (Exception e)
        {
            e.printStackTrace();
        }       
    }
}

(3) 运行方法一——在命令行中运行
在命令框下,切换到你的类所在的目录(注意,代码里最好不要有package信息)。先进行编译MyRemote接口,再编译MyRemoteImpl和MyRemoteClient类。然后运行rmic产生stub,再通过rmiregistry进行注册。
这里写图片描述

另外启动一个终端,切换到类所在目录,运行服务端程序
这里写图片描述

再启动一个终端,切换到类所在目录,运行客户端程序
这里写图片描述
当你看到“Server say, Hey”时,说明已经运行成功。

(4) 运行方法二——在Eclipse中运行
本人习惯在Eclipse中写代码,所以想在Eclipse中直接运行RMI代码,这就需要先安装一个插件,然后进行相关配置。

① 安装插件
Eclipse RMI Plugin,你可以从网上搜,或者从这个链接下载:http://download.youkuaiyun.com/detail/liu_005/9534228

② 下载后进行解压,将解压后的两个文件夹的文件拷贝到你的Eclipse目录下的相应文件夹中,并重启Eclipse,如果出现如下图标说明插件安装成功。
这里写图片描述

③ 配置
在项目中右键,选择run configurations。在如下界面中,对于java.security.policy项选择你的java目录的\Java\jdk1.7.0_79\jre\lib\security目录下的java.security文件,对于java.rmi.server.codebase项选择你当前项目的bin目录,对于java.rmi.server.userCodebaseOnly项选择false(这个我不太确定,如果不行,可以选择true试试)。设置完成后开始运行。
这里写图片描述

④ 运行服务类请选择RMI Application,运行客户类可以选择java Application或者RMI Application。

4、 总结
以上就是我对于在Java中实现RMI的一个简单实验,希望对初学者理解和搭建RMI有帮助。由于本人水平有限,如有错误之处,敬请大神指正,不胜感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值