JAVA RMI 實例

下面我將介紹一個完整的實例,讓初學者能快速體驗RMI的功用。

分爲如下四個步驟

1. 建立遠程接口及聲明遠程方法(HelloInterface.java)
2. 實現遠程接口及遠程方法(繼承UnicastRemoteObject)(Hello.java)
3. 啓動RMI註冊服務,並註冊遠程對象(HelloServer.java)
4. 客戶端查找遠程對象,並調用遠程方法(HelloClient)
5. 執行程序:啓動服務HelloServer;運行客戶端HelloClient進行調用java

 

具體代碼及對應步驟以下:

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.javaide

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)this

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)spa

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進行調用.net

執行結果:設計

服務端:3d

客戶端:code

 


參考:
  1. JAVA RMI 實例orm

  2. 《Head First 設計模式》
相關文章
相關標籤/搜索