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

鍾超發表於2011-11-27

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. Sample Code

(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!”

相關文章