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