2007年11月17日 星期六

Head First Java 讀後整理(15) - Distributed Computing

1、一般來說, object method 的呼叫都是在相同的 JVM 上進行的(亦即相同 heap 上的兩個 object 之間)

2、RMI(Remote Method Invoction) 技術可以使用 Socket 與 I/O 讓呼叫 remote object method 就像 local object method 一樣

3、RMI 是由 4 個部分所建構出來的:Client object、Client helper(stub) <=> Server helper(skeleton)、Server obejct

4、在 RMI 中 client helper 稱為「stub」;而 server helper 稱為「skeleton」

5、helper 的作用在於處理所有 client 與 server 間低階網路輸出入細節的部分,讓使用者感覺 client 與 server 都在 local 端

6、RMI 的執行流程:
(1) client object 所呼叫的為 stub 的 method,因為其偽裝為提供服務的 object,扮演著 proxy 的角色
(2) stub 收到請求後,會去連絡 skeleton,將資訊傳送過去
(3) 而 skeleton 透過 socket 收到 stub 的請求後,解析資訊並呼叫真正的服務(server object method)
(4) skeleton 取得回傳值後,就會把它包裝後送回給 stub
(5) stub 收到回傳資訊後,會將其解開並傳回給 client object

7、client object 看似在呼叫遠端的 method,但實際只是呼叫在 local 處理的 Socket 與 Stream 細節的 proxy

8、由於 RMI 是透過網路進行 method 的呼叫,因此都會拋出例外,因此必須處理

9、建構 RMI 的 5 個步驟:
//引用 RMI package
import java.rmi.*;

//制定繼承 Remote interface 的 interface
//用以宣告此 interface 與 RMI 有關
public interface MyRemote extends Remote {
//每個遠端呼叫都會被認為有風險,因此必須宣告會拋出例外
public String sayHello() throws RemoteException;
} //close MyRemote
  • 實作 Remote
//引用 RMI package
import java.rmi.*;
import java.rmi.server.*;

//1、必須繼承 UnitcastRemoteObject,才能成為遠端服務的務建
//2、必須實作 Remote interface
public class MyRemoteImplement extends UnicastRemoteObject implements MyRemote {

//3、撰寫無參數的 constructor,並宣告會拋出 RemoteException 例外
public MyRemoteImplement() throws RemoteException { } //close constructor

public static void main(String[] args) {
try {
//4、向 RMI registry 登記服務
MyRemote service = new MyRemoteImplement();
//幫服務命名(client 會靠名字查詢 registry),並向 RMI registry 登記
//RMI 會將 stub 做交換並擺 stub 加入 registry
Naming.rebind("RemoteHello", service);
} catch(Exception ex) { ex.printStackTrace(); }
} //close main

public String sayHello() {
return "Server says, 'Hey!'";
} //close sayHello
} //close MyRemoteImplement
  • 產生 stub 與 skeleton
# 書上說會產生 stub 與 skeleton 檔
# 但實際測試後,發現只有 stub 檔
# 只有產生出 MyRemoteImplement_Stub.class,但並不影響後面程式的執行
shell> rimc MyRemoteImplement
  • 執行 rmiregistry
shell> rmiregistry
  • 啟動服務(main() 會將物件初始化並把它登記給 RMI registry)
shell> java MyRemoteImplement

10、client 取得 stub object 的方式
(1) 用戶端查詢 RMI registry
(2) RMI registry 傳回 stub object
(3) client 就像取用真正服務一樣,呼叫 stub object 上的 method
import java.rmi.*;

public class MyRemoteClient {
public static void main(String[] args) {
new MyRemoteClient().go();
} //close main

public void go() {
try {
//(1)用戶端查詢 RMI registry
//(2)RMI registry 傳回 stub object
MyRemote service = (MyRemote)Naming.lookup("rmi://127.0.0.1/RemoteHello");
//(3)client 就像取用真正服務一樣,呼叫 stub object 上的 method
String s = service.sayHello();
System.out.println(s);
} catch(Exception ex) { ex.printStackTrace(); }
} //close go
} //close MyRemoteClient

11、RMI 中 client 與 server 的架構與所需的檔案 (來源:Head First Java)


12、servlet 是完全在 HTTP server 上跑的 Java 程式,是一種用來處理與 user 互動的網頁程式

13、要 compiler servlet 需要 servlets.jar 檔案,但是它不是標準函式庫的一部分,需要從其他處下載

14、JSP 與 servlet 的差異
JSP 為 Java Server Pages。實際上 web server 會將 JSP 轉換為 servlet。
而兩者的差別在於 servlet 是讓使用者寫出帶有 HTML 輸出的 class;而 JSP 剛好相反,讓使用者寫出帶有 Java 程式的網頁。

15、JSP 的優點在於更容易撰寫 HTML 的部分,而不會像 servlet 一樣需要用一些難以閱讀的 print 指令來產生 HTML

16、EJB server 具有一些 RMI 不會有的功能,例如:交易管理、安全性、資料庫、網路....等等

沒有留言:

張貼留言