• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
乐碎碎
程序媛想的事儿
博客园    首页    新随笔    联系   管理    订阅  订阅
JAVA RMI 实例

下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用。

分为以下四个步骤

1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
4. 客户端查找远程对象,并调用远程方法(HelloClient)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用

 

具体代码及对应步骤如下:

1. 创建远程接口及声明远程方法(HelloInterface.java)

java 代码
package cn.telling.rmi;

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

/**
 * 远程接口必须扩展接口java.rmi.Remote
 * 
 * @ClassName: HelloInterface TODO
 * @author xingle
 * @date 2015-9-28 下午4:37:12
 */
public interface HelloInterface extends Remote ,Serializable{
    /**
     * 远程接口方法必须抛出 java.rmi.RemoteException
     */
    public String sayHello() throws RemoteException;;

}

 

2. 实现远程接口及远程方法(继承UnicastRemoteObject)HelloImpl.java

java 代码
package cn.telling.rmi;

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

/**
 * 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface
 * 
 * @ClassName: HelloImpl TODO
 * @author xingle
 * @date 2015-9-28 下午4:38:47
 */
public class HelloImpl extends UnicastRemoteObject implements HelloInterface {
    private String message;

    /**
     * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常
     * 
     * @param msg
     * @throws RemoteException
     */
    public HelloImpl(String msg) throws RemoteException {
        this.message = msg;
    }

    /**
     * 
     * @Description: TODO
     * @return
     * @throws RemoteException
     * @author xingle
     * @data 2015-9-28 下午4:39:41
     */
    @Override
    public String sayHello() throws RemoteException {
        System.out.println("Called by HelloClient");
        return message;
    }

}

 

3. 启动RMI注册服务,并注册远程对象(HelloServer.java)

java 代码
package cn.telling.rmi;

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

/**
 * 
 * @ClassName: HelloServer TODO
 * @author xingle
 * @date 2015-9-28 下午4:41:47
 */
public class HelloServer {

    public static void main(String[] args) {
        try {
            // 启动RMI注册服务,指定端口为1099 (1099为默认端口)
            // 也可以通过命令 $java_home/bin/rmiregistry 1099启动
            // 这里用这种方式避免了再打开一个DOS窗口
            // 而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用
            LocateRegistry.createRegistry(1099);
            // 创建远程对象的一个或多个实例
            // 可以用不同名字注册不同的实例
            HelloImpl service = new HelloImpl("hello,world!");
            // 如果要把hello实例注册到另一台启动了RMI注册服务的机器上
            // Naming.rebind("//192.168.1.105:1099/Hello",hello);
            Naming.rebind("Hello", service);
            System.out.println("Hello Server is ready.");
        } catch (RemoteException e) {
            System.out.println("Hello Server failed: " + e);
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

    }

}

 

4. 客户端查找远程对象,并调用远程方法(HelloClient)

java 代码
package cn.telling.rmi;

import java.rmi.Naming;

/**
 * 
 * @ClassName: HelloClient TODO
 * @author xingle
 * @date 2015-9-28 下午4:54:51
 */
public class HelloClient {
    public static void main(String[] argv) {
        try {
            HelloInterface hello = (HelloInterface) Naming.lookup("Hello");

            // 如果要从另一台启动了RMI注册服务的机器上查找hello实例
            // HelloInterface hello =
            // (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");

            // 调用远程方法
            System.out.println(hello.sayHello());
        } catch (Exception e) {
            System.out.println("HelloClient exception: " + e);
        }
    }

}

 

5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用

执行结果:

服务端:

客户端:

 


参考:
  1. JAVA RMI 实例

  2. 《Head First 设计模式》
posted on 2015-09-28 17:04  xingle0917  阅读(2069)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3