天天看點

RMI設計模式基本原理與示例

1. Name

RMI是Romote Method Invocation的縮寫,就是遠端方法調用。

2. Intent

具體的說,就是能夠通過這種機制,實作在一個JVM上調用另一個JVM上的Java對象的方法。

3. Structure

(1)RMI Interface and Class

第一步:繼承了Remote的interface

定義一個繼承了Remote的interface,命名為TestRMIService。在其中有我們期望在Client端調用的方法testHello(),注意要抛出RemoteException。

第二步:繼承了UnicastRemoteObject且實作了TestRMIService的class

定義一個繼承了UnicastRemoteObject且實作了TestRMIService的class,命名為TestRMIServiceImpl。在其中實作testHello方法。

(2)RMI Server

第一步:

定義一個class,命名為TestServer,其中有main方法。在main方法中執行個體化TestRMIService一個遠端對象,命名為testRMI。

第二步:

建立一個Registry,并向遠端對象testRMI注冊,注冊名為“rmi://locahost:1234/testrmi”。

(3)RMI Client

第一步:

定義一個class,命名為TestClient,其中有main方法。查詢注冊

第二步:

查詢注冊名為“rmi://locahost:1234/testrmi”的TestRMIService遠端對象,查詢結果為testRMI。

第三步:

調用遠端對象testRMI的方法testHello。

4. 執行個體代碼

(1)TestRMIService

package com.sinosuperman.rmi;  
 
import java.rmi.Remote;  
import java.rmi.RemoteException;  
 
public interface TestRMIService extends Remote {  
    public String testHello() throws RemoteException;  
}  
           

(2)TestRMIServiceImpl

package com.sinosuperman.rmi;  
  
import java.rmi.RemoteException;  
import java.rmi.server.UnicastRemoteObject;  
  
public class TestRMIServiceImpl extends UnicastRemoteObject implements TestRMIService {  
  
    private static final long serialVersionUID = -9039976499370682232L;  
      
    public TestRMIServiceImpl() throws RemoteException {  
    }  
 
    @Override  
    public String testHello() throws RemoteException {  
        return "I'm RMI, Hello World!";  
    }  
}  
           

(3)TestServer

package com.sinosuperman.server;  
  
import java.net.MalformedURLException;  
import java.rmi.AlreadyBoundException;  
import java.rmi.Naming;  
import java.rmi.RemoteException;  
import java.rmi.registry.LocateRegistry;  
  
import com.sinosuperman.rmi.TestRMIService;  
import com.sinosuperman.rmi.TestRMIServiceImpl;  
  
public class TestServer {  
      
    public static void main(String[] args) {  
          
        try {  
            /* Create a Remote object. */  
            TestRMIService testRMI = new TestRMIServiceImpl();  
              
            /* Create a registry object with 1234 port. */  
            LocateRegistry.createRegistry(1234);  
              
            /* Register the Remote object to RMI registry server, and name it as testrmi. */  
            Naming.bind("rmi://localhost:1234/testrmi", testRMI);  
             
            System.out.println("注冊遠端對象成功");  
              
        } catch (RemoteException e) {  
            System.out.println("遠端對象建立異常");  
            e.printStackTrace();  
        } catch (MalformedURLException e) {  
            System.out.println("URL畸形異常");  
            e.printStackTrace();  
        } catch (AlreadyBoundException e) {  
            System.out.println("重複綁定異常");  
            e.printStackTrace();  
        }  
    }  
}  
           

(4)TestClient

package com.sinosuperman.rmi;  
  
import java.net.MalformedURLException;  
import java.rmi.Naming;  
import java.rmi.NotBoundException;  
import java.rmi.RemoteException;  
  
public class TestRMIClient {  
    public static void main(String[] args) {  
        try {  
            TestRMIService testService = (TestRMIService) Naming.lookup("rmi://localhost:1234/testrmi");  
            System.out.println(testService.testHello());  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (RemoteException e) {  
            e.printStackTrace();  
        } catch (NotBoundException e) {  
            e.printStackTrace();  
        }  
    }  
}  
           

5. Test

(1)運作TestServer

在Eclipse主界面的Package Explorer中你所建立的測試RMI的工程中的com.sinosuperman包中,右擊TestServer,選擇Run As,選擇Java Application。

這時界面上會顯示:

“注冊遠端對象成功”

(2)運作TestClient

在Eclipse主界面的Package Explorer中你所建立的測試RMI的工程中的com.sinosuperman.rmi包中,右擊TestClient,選擇Run As,選擇Java Application。

這時界面上會顯示:

“I'm RMI, Hello World!”