1. 程式人生 > >RMI JDK

RMI JDK

rmi

  1. 創建接口

/**
 * 定義一個遠程接口,必須繼承Remote接口
 */
public interface HelloService extends Remote
{
    /**
     * 需要遠程調用的方法必須拋出RemoteException異常
     * @param msg
     * @return
     * @throws RemoteException
     */
    String sayHello(String msg) throws RemoteException;
}


2.創建實現類

/**
 * 遠程的接口的實現.
 */
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService
{

    /**
     *  因為UnicastRemoteObject的構造方法拋出了RemoteException異常,
     *  因此這裏默認的構造方法必須寫,必須聲明拋出RemoteException異常
     * @throws RemoteException
     */
    public HelloServiceImpl() throws RemoteException {
    }

    /**
     * 業務實現方法
     * @param msg
     * @return
     * @throws RemoteException
     */
    public String sayHello(String msg) throws RemoteException {
        return "server received the msg : " + msg;
    }
}


3.創建啟動服務

/**
 * 創建RMI註冊表,
 * 啟動RMI服務,
 * 並將遠程對象註冊到RMI註冊表中。
 */
public class HelloServer
{
    public static void main(String[] args)
    {
        try
        {
            //創建一個遠程對象
            HelloService helloService = new HelloServiceImpl();

            //本地主機上的遠程對象註冊表Registry的實例,並指定端口為8888.
            // 這一步必不可少(Java默認端口是1099),必不可缺的一步.
            // 缺少註冊表創建,則無法綁定對象到遠程註冊表上
            LocateRegistry.createRegistry(9123);

            //把遠程對象註冊到RMI註冊服務器上,並命名為hello
            //綁定的URL標準格式為:rmi://host:port/name(其中協議名可以省略)
            Naming.bind("rmi://localhost:9123/hello", helloService);

            System.err.println("==========遠程對象綁定成功============");
        } catch (RemoteException e) {
            System.err.println("創建遠程對象發生異常!");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            System.out.println("發生URL畸形異常!");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            System.out.println("發生重復綁定對象異常!");
            e.printStackTrace();
        }

    }
}


4.創建客戶端

/**
 * 在客戶端調用遠程對象上的遠程方法
 */
public class HelloClient
{
    public static void main(String[] args)
    {
        try
        {
            //在RMI服務註冊表中查找名稱為helloService的對象,並調用其上的方法
            HelloService helloService 
            =(HelloService) Naming.lookup("rmi://localhost:9123/hello");

            System.out.println(helloService.sayHello("測試"));
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}


註:RMI要求服務端和客戶端的編寫語言都是java.如果需要跨語言,則建議使用webservice.


參考地址:http://docs.oracle.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html





本文出自 “旅行者” 博客,請務必保留此出處http://881206524.blog.51cto.com/10315134/1922761

RMI JDK