Java远程方法调用(RMI)

远程接口

  • 远程接口必须声明为public

  • 远程接口必须继承java.rmi.Remote

  • 远程接口中的方法必须将java.rmi.RemoteException声明于其throws子句中

  • 作为参数或者返回值的远程对象,必须声明为其对应的远程接口,而不是实际的实现类

  • Example

package com.sk.RMI;

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

/**
 * 远程接口必须声明为public,并且必须继承java.rmi.Remote类
 */
public interface RMIQueryStatus extends Remote
{
    /**
     * 远程接口函数必须将RemoteException声明其throws子句内
     * @param fileName
     * @return
     * @throws RemoteException
     */
    RMIFileStatus getFileStatus(String fileName) throws RemoteException;
}

远程对象类

package com.sk.RMI;

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

/**
 * 远程对象类;
 * 远程对象类继承UnicastRemoteObject类,实现RMIQueryStatus接口
 */
public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus
{
    @Override
    public RMIFileStatus getFileStatus(String fileName) throws RemoteException
    {
        RMIFileStatus status = new RMIFileStatus(fileName);
        return null;
    }
}

RMI远端对象注册点获得本地存根对象

package com.sk.RMI;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

/**
 * (1)RMI服务器创建院层对象类的对象,将对象绑定到注册服务上面
 * (2)RMI客户程序则通过注册点,利用名字查找远程对象,并构造出响应的本地存根对象。
 * (3)RMI客户程序就可以调用远程方法了
 * 
 */
public class RMIQueryStatusServer
{
    public static void main(String[] args)
    {
        try
        {
            //创建远程对象类实例
            RMIQueryStatusImpl queryService = new RMIQueryStatusImpl();

            LocateRegistry.createRegistry(12090);

            //绑定远端对象到名字
            Naming.bind(RMI_URL,queryService);

            System.out.println("servy ready");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

客户端程序获取远程引用

package com.sk.RMI;

import java.rmi.Naming;

/**
 *
 */
public class RMIQueryStatusClient
{
    public static void main(String[] args)
    {
        try
        {
            //创建远程接口的实例对象
            RMIQueryStatus query = (RMIQueryStatus) Naming.lookup(RMIQueryStatusServer.RMI_URL);
            //调用远程方法如同调用本地方法
            RMIFileStatus status = query.getFileStatus("/tmp/RMI");
            System.out.println(status);
        }
        catch (Exception e)
        {
            //远程方法和普通方法的一个差别:远程方法可能会抛出RemoteException异常
            e.printStackTrace();
        }
    }
}

类间的关系

在这里插入图片描述

发布了280 篇原创文章 · 获赞 49 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/kaikai_sk/article/details/88640683