[LTM] Chương 9 : RMI (Remote Method Invocation)

Người đăng: share-nhungdieuhay on Thứ Tư, 7 tháng 5, 2014


Nội dung
Giới thiệu
Hoạt động của RMI
Hoạt động của lớp trung gian
Thiết kế và cài đặt một chương trình RMI
Thực thi hệ chương trình RMI, ex
Chuyển tham số trong RMI, ex
Tham trị
Tham chiếu
Tuần tự hóa đối tượng, ex
Factory Object, ex
RMI với firewall
Giới thiệu
Lập trình HĐT phân tán:
Môi trường hợp tác
Tận dụng nguồn tài nguyên phân tán trên mạng
Java: giải quyết vấn đề lập trình phân tán
Có .NET của Microsoft
Trong Java, sử dụng kỹ thuật RMI để cài đặt các đối tượng phân tán.
KT xuyên  suốt trong toàn bộ kiến trúc của Java

Giới thiệu
Local method Invocation: mã lệnh của hàm (hay thủ tục)  được nạp thẳng vào bộ nhớ và thực thi ngay trên máy cục bộ
Muốn nạp nội dung hàm hay đối tượng ở 1 máy nào đó gọi chúng từ một máy khác? 
Remote  Method  Invocation (RMI) : là cách thức giao tiếp giữa các đối tượng Java có mã lệnh cài đặt nằm trên máy khác nhau có thể gọi lẫn nhau.
Mô hình triệu gọi các đối tượng từ xa
RMI và RPC (Remote Procedure Calling)
Like RPC ,RMI has the following similarities
Remote calls can be made
Client/server contract based on interface
Unlike
RPC : hỗ trợ đa ngôn ngữ
RMI: chỉ hỗ trợ các ứng dụng được viết bằng Java
RMI – Client/Server
Mục đích của RMI 
Hỗ trợ gọi phương thức từ xa trên các đối tượng trong các máy ảo (JVM) khác nhau 
Tích hợp mô hình đối tượng phân tán vào ngôn ngữ lập trình Java theo một cách tự nhiên, có tin cậy trong khi vẫn duy trì các ngữ cảnh đối tượng của ngôn ngữ lập trình Java 
Làm cho mô hình đối tượng phân tán và mô hình đối tượng cục bộ không có sự khác biệt. 
Vấn đề phát sinh
Việc gọi phương thức của đối tượng từ xa luôn phức tạp hơn gọi phương thức cục bộ: 
Việc tham chiếu đến biến, địa chỉ của đối tượng khác nhau ở các máy khác nhau 
Các tham số truyền cho phương thức của đối tượng ở xa phải được đóng gói và chuyển qua mạng đến phương thức thực sự. (local-stack)
Lời gọi phương thức từ xa phải thông qua mạng và có thể bị ngắt ngang do mạng gặp sự cố 
Phụ thuộc vào kết nối mạng


Giải pháp
Đối tượng trên hai máy khác nhau không gọi trực tiếp mà thông qua lớp trung gian. 
Lớp trung gian tồn tại ở cả hai phía Client và Server.  
Lớp ở máy Client gọi là Stub, 
Lớp ở máy Server gọi là Skel(Skeletion)
Lớp trung gian Stub sẽ biết cách thông báo lỗi khi có các sự cố về mạng cho Client
Lớp trung gian Stub và Skeletion
Lớp trung gian Stub và Skeletion
Trình biên dịch Java (rmic.exe) sẽ tạo ra 2 lớp trung gian:
Lớp Stub (lớp móc): chuyển về cho client
Lớp Skeleton (lớp nối): Phía Server
Stub và Skeletion sẽ giúp các đối tượng ở xa giao dịch với nhau ?
Đối tượng trên máy Server cần cung cấp một giao diện tương ứng với các phương thức của nó (Server Object) cho phép đối tượng Client gọi nó trên máy Client dễ dàng.
Đối tượng client sẽ luôn nghĩ rằng nó đang hoạt động trực tiếp với đối tượng server trên máy cục bộ.
Lớp trung gian Stub và Skeletion
Ví dụ: 
Phương thức A truyền cho phương thức B hai số a,b. Phương thức B sẽ cộng hai số a,b cho ra kết quả c và trả về phương thức A. 

Kiến trúc của RMI
Kiến trúc của RMI
Quá trình hoạt động của RMI
Quá trình hoạt động của RMI
B1: RMI-server đăng ký tên của đối tượng với bộ q.lý Registry.
B2: Bộ quản lý Registry trả về tham chiếu đến đối tượng ở xa (RMI Server) thông qua lớp giao tiếp
B3-4: RMI-client liên lạc với bộ Registry để lấy về tham chiếu đến đối tượng trên Server. 
Các quá trình đăng ký và truy tìm tên đối tượng được Java quản lý bằng các hàm giao tiếp API JNDI
B5-7: Client sẽ gọi các phương thức của đối tượng trên Server
Khi một phương thức được gọi, sẽ được chuyển tiếp đến lớp trung gian Stub, rồi gọi đến lớp Skeleton (hđ Stub).
B8-10: Lớp Skeleton sẽ trực tiếp yêu cầu đối tượng thực thi phương thức và trả kết quả cho Client (hđ Skeletion)

Trình (bộ quản lý)đăng ký Registry
là một chương trình dịch vụ chạy ở hậu trường (rmiregistry.exe), thực hiện mở ổ cắm socket và lắng nghe các yêu cầu gởi đến cổng mặc định 1099, có thể chỉ định một cổng khác với cổng 1099.
Ví dụ: C:\j2sdk1.4.0\bin\ rmiregistry.exe 9999
Đóng vai trò như là một DNS nhỏ cho các đối tượng từ xa thực hiện tìm kiếm dịch vụ, 
Hoạt động của Stub, Skeleton
RMI trong JAVA
 Các lớp và các giao tiếp trong gói java.rmi
Giao tiếp Remote 
Lớp Naming
RemoteObject class
RemoteServer class
UnicastRemoteObject class
Giao tiếp Registry



RMI trong JAVA - Lớp Naming
Lớp java.rmi.Naming truyền tin trực tiếp với một trình đăng ký đang chạy trên server để ánh xạ các URL rmi://hostname/Objectname thành các đối tượng từ xa cụ thể trên host xác định:
Rmi là giao thức dùng để đăng kí. 
Hostname và port của Server nơi bộ Registry đang chạy. 
Objectname là tên tự đặt, phía client sẽ dựa vào tên này để truy tìm tham chiếu đến đối tượng cần dùng.
URL rmi  vs. URL http.

Naming class - methods
Lớp Naming cung cấp các phương thức sau: 
public static String[] list(String url) throws RemotException 
trả về một mảng các xâu ký tự, mỗi xâu là một URL đã được gắn với một tham chiếu. url là URL của trình đăng ký Naming.  
public static Remote lookup(String url) throws RemotException, NotBoundException, AccessException, MalformedURLException 
Client lookup để tìm kiếm một đối tượng từ xa gắn liền với tên đối tượng. 
NotBoundException: server ở xa không nhận ra tên của nó.

Naming class - methods
Public static void bind(String url, Remote object) throws RemotException, AlreadyBoundException, MalformedURLException, AccessException 
để liên kết  một tên với một đối tượng ở xa. Nếu thành công thì client có thể tìm kiếm đối tượng stub từ trình đăng ký. 
Có rất nhiều tình huống có thể xảy ra khi gán tên.
MalformedURLException: url không đúng cú pháp. 
RemoteException: không thể liên lạc được với trình đ.ký
AccessException: client không được phép gán các đối tượng trong trình đăng ký. 
AlreadyBoundException: nếu đối tượng URL đã gắn với một đối tượng cục bộ
Naming class - methods
public static void rebind(String url, Remote obj)throws RemoteException, AccessException, MalformedURLException
Phương thức này giống như phương thức bind() ngoại trừ việc là nó gán URL cho đối tượng ngay cả khi URL đã được gán.
Giao tiếp Remote 
Giao tiếp Remote 
Giao tiếp này không khai báo bất kỳ phương thức nào. 
Khai báo một đối tượng được truy xuất từ xa:
RemoteObject class
Giao tiếp Registry
cho phép các client tìm kiếm các đối tượng ở xa trên một server theo tên. 
Các phương thức
Bind() để gán một tên với một đối tượng từ xa cụ thể
List() liệt kê tất cả các tên đã được đăng ký với trình đăng ký
Lookup() tìm một đối tượng từ xa cụ thể với một URL cho trước gắn với nó
Rebind() gán một tên với một đối tượng ở xa khác
Unbind() loại bỏ một tên đã được gán cho một đối tượng ở xa trong trình đăng ký
Registry.REGISTRY_PORT là cổng mặc định để lắng nghe các các yêu cầu. Giá trị mặc định là 1099.

Các bước thiết kế và cài đặt RMI
1. Đặc tả một giao tiếp từ xa (remote interface) trên server.
2. Hiện thực giao tiếp từ xa (remote interface) để Xây dựng một đối tượng từ xa (remote object) .
3. Sinh ra các Stub phía client và Skeleton phía server.
4. Xây dựng chương trình phía Server
5. Xây dựng chương trình phía Client.
6. Khởi động bộ đăng ký RMI (RMI registry)
7. Khởi động các đối tượng từ xa phía server
8. Chạy chương trình phía client.
Ex, Cài đặt chương trinhg  cộng 2 số nguyên
Triệu gọi đối tượng RMI giữa trình khách và đối tượng chủ ở xa
1. Đặc tả một Remote Interface (at Srv)
Các đối tượng trong Remote Inteface phải có khả năng giao tiếp với các đối tượng ở xa (Kế thừa Remote class)
Các phương thức phải có khả năng phát ra ngoại lệ Remote Exception.
// Calculator.java
import java.rmi.*;
public interface Calculator extends Remote
{
public int addNum(int x,int y) throws RemoteException;
}
Biên dịch
2. Hiện thực Remote Interface
Từ giao tiếp RI đã định nghĩa, đối tượng thực sự phải được cài đặt:
 /* CalculatorImpl.java*/
import java.rmi.*;
// extends UnicastRemoteObject 
public class CalculatorImpl implements Calculator {
public int addNum(int x,int y) throws RemoteException {
System.out.println("Client request to calculate");
return (x+y);
}
}
Biên dịch
3. Sinh trung gian Stub và Skeleton
Dựa vào lớp cài đặt CalImpl.class, trình biên dịch rmic.exe của Java sẽ cung cấp hai lớp trung gian
C:\RMI>rmic CalculatorImpl
Kết quả
CalculatorImpl_Stub.class
CalculatorImpl_Skel.class //opt
4. Xây dựng chương trình trên Server
/* CalServer.java*/
public class CalculatorServer{
public static void main(String[] args) throws AlreadyBoundException {
try{
//tao doi tuong Calculator  thuc su
CalculatorImpl c= new CalculatorImpl();
System.out.println("Exporting Calculator ! ");
//thông báo sự hiện diện c là đối tượng có khả năng Remote cho JVM
UnicastRemoteObject.exportObject (c);
//đăng ky doi tuong với trình quản lý rmi
Naming.bind("rmi://localhost/Van",c);
System.out.println("Register Calculator!");
} catch(Exception e) 
{ System.out.println(e); }
   }
}
Biên dịch

5. Xây dựng chương trình trên Client
 Chương trình phía bên máy client có khả năng gọi và sử dụng đối tượng Cal trên máy server:
/* CalculatorClient.java*/
import java.rmi.*;
public class CalculatorClient {
public static void main(String[] args){
try{
System.out.println("Finding Object … ");
// tìm đối tượng cần truy xuất theo tên -> tường minh
Calculator c= (Calculator)Naming.lookup ("rmi://localhost/Van");
// goi phuong thuc cua doi tuong
System.out.println(c.addNum(5,10));
} catch(Exception e) { System.out.println(e); }
  }
}                                          Biên dịch
6. Kích hoạt bộ đăng ký
C:\RMI>rmiregistry.exe
Nó có nhiệm vụ đón nhận (luôn trong trạng thái sẵn sàng phục vụ) các kết nối chứa thông tin về đối tượng do phương thức Naming.bind() gửi đến. 
Mặc định rmiregistry.exe lắng nghe các kết nối gửi đến cổng 1099, có thể chỉ định lại:
C:\RMI>rmiregistry.exe 2012
rmiregistry.exe có trong ..\Java\jdk1.7.0_05\bin
Không cần chạy service trên nếu có: LocateRegistry.createRegistry(1099);
trong main của trình Server

7. K.động các đối tượng phía Server
C:\RMI>java CalculatorServer
Exporting Calculator…
Register Calculator!
Cũng như rmiregistry.exe, sau khi Calculator Server được gọi, hàm Naming.bind() sẽ đi vào vòng lặp vô tận để chờ nhận yêu cầu từ client đến. 
8. Chạy chương trình phía Client
C:\RMI>java CalculatorClient
Finding Object…
15
-> kết quả trả về là lời gọi đến phương thức addNum() của đối tượng CalculatorImpl. 
Quay lại cửa sổ DOS trên Server thấy:
Client request to calculate
-> hàm addNum() đã được gọi thực hiện
Test: RMI_Cal\ (or RMI\Cal - ecls)
Các lớp được tạo ra trong RMI
Các lớp và phạm vi sử dụng

Review
Vận hành RMI trên JVM 
Vận hành RMI trên máy thực
Khi vận hành trên các máy tính vật lý khác nhau cần chú ý về thư viện, security policy.
Tự tạo bộ đăng kí 
Không dùng rmiregistry.exe
Tự tạo bộ đăng kí và tự đăng kí đối tượng: 
Dùng: createRegistry()của lớp LocateRegistry.
Đăng ký một đối tượng khác:

Tìm lớp Stub dựa vào Classpath
Khi Server đăng ký tên đối tượng với rmiregistry, rmiregistry sẽ đi truy tìm lớp trung gian Stub. 
Dựa vào CLASSPATH:
Java dựa vào biến môi trường CLASSPATH để truy tìm các tập tin .class. 
Giá trị mặc định của Classpath là trỏ đến thư mục chứa hiện hành
Nếu CLASSPATH không chỉ or chỉ sai đường dẫn, lỗi xảy ra: ClassNotFoundException: ClassName
Để thay đổi giá trị cho CLASSPATH,  dùng: 
Set Classpath=.;C:\RMI\
Tìm lớp Stub dựa vào tùy chọn Codebase
Codebase (HTML): [CODEBASE = URLDirectory]
Codebase cho phép nạp tự động các lớp Stub từ xa. (khi đăng ký đối tượng với rmiregistry trên máy chủ)
Thực hiện:
máy chủ phải hỗ trợ thêm dịch vụ WebServer chạy trên máy nơi rmiregistry đang chạy . 
chép tập tin (_Stub.class) vào thư mục (myclass) của trình chủ web server.
biến Classpath trên máy ảo nơi rmiregistry đang chạy không được trỏ đến cùng thư mục chứa class (1: classpath, 2: codebase)
Nạp stub từ xa xuống client  thông qua web server
Nạp file từ xa và security policy phía client
Với Java tất cả các thao tác kết nối và chép tập tin lạ từ một máy khác về một máy đều phải thông qua lớp bảo vệ: 
SecurityManager
Khi nạp lớp Stub tự động, chương trình của client cần bổ sung thiết lập lớp phòng vệ:
System.setSecurityManager(new RMISecurityManager()); //sau try{
Nạp file từ xa và security policy phía client
Nạp file từ xa và security policy phía client
Hệ thống phòng vệ RMISecurityManager sẽ cho phép hoặc cấm các kết nối từ xa dựa trên thiết lập trong file: ..\java\jdk1.7.0_05\jre\lib\security\java.policy
Mở tập tin java.policy, edit: 
grant {
permission java.security.AllPermission;
// ko phòng vệ 
permission java.net.SocketPermission "*:1099", "connect, accept, resolve";
// This allows RMI clients to contact the RMIRegistry of any host
};
Chuyển tham số trong RMI
 Đối với việc truyền tham số qua mạng theo cơ chế RMI thì có hai nguyên tắc sau:
Tất cả các kiểu dữ liệu đơn giản như int, char,… đều được truyền theo tham trị.
Tất cả các dữ liệu kiểu đối tượng muốn truyền qua mạng đều buộc phải cài đặt một trong hai tiếp là Remote hoặc Serializable. 
Các đối tượng cài giao tiếp Remote sẽ được truyền theo tham chiếu 
Các đối tượng cài đặt giao tiếp Serializable sẽ được truyền theo tham trị.
Các đối tượng ko được cài đặt giao tiếp Serializable hay Remote thì ko thể dùng làm tham số truyền qua mạng được
Chuyển đối tượng theo tham trị
Các đối tượng cài đặt giao tiếp Serializable sẽ được truyền theo tham trị
Giao tiếp Serializable dùng cho mục đích báo hiệu: 
Tất cả các lớp đối tượng cài đặt trong giao tiếp Serializable đều có khả năng tuần tự hóa.
Khi gọi một phương thức của đối tượng từ xa, nếu trong lời gọi có y/c tham số kiểu đối tượng:
 đối tượng sẽ được đóng gói và chuyển toàn bộ đến server (nơi tiếp nhận và thực thi phương thức). 
Tại Server, đối tượng được bung ra lại trạng thái ban đầu và được sử dụng
Tuần tự hóa đối tượng
Tuần tự hóa là quá trình chuyển (read/write) tập hợp các thể hiện đối tượng chứa các tham chiếu tới các đối tượng khác thành một luồng byte tuyến tính (tuần tự), 
luồng này có thể được:
 gửi đi qua một Socket, 
lưu vào tệp tin hoặc được 
 xử lý dưới dạng một luồng dữ liệu. 
Việc lưu đối tượng trên đĩa, dữ liệu trên tập tin là loại dữ liệu tuần tự (trải phẳng đối tượng ra theo thứ tự)
Serialization
khả tuần tự hóa
Chỉ có đối tượng thực thi giao diện Serializable mới có thể được ghi lại và được phục hồi bởi các tiện ích tuần tự hóa
một lớp thực thi giao diện Serializable thì lớp đó có khả năng tuần tự hóa->khả tuần tự hóa 
Example Serialization
public class writeObj {
 public static void main(String[] args) throws Exception {
    Junk obj1 = new Junk("Lê Xuân Anh");
    Junk obj2 = new Junk("Lê Quốc Ba");
    ObjectOutputStream objectOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("b.txt")));
objectOut.writeObject(obj1); // Write object
    objectOut.writeObject(obj2); // Write object
    objectOut.close(); // Close the output stream
ObjectInputStream objectIn = null;
    int Count = 0;
    Junk object = null;
objectIn = new ObjectInputStream(
new BufferedInputStream(new FileInputStream("b.txt")));
while (Count < 2) {
      object = (Junk) objectIn.readObject(); Count++;
      System.out.println("Object " + Count + ": " + object.toStr());     }
    objectIn.close(); 
  }
}
Ex:  truyền tham số qua mạng sử dụng giao tiếp Serializable
RMI_Ball
1. Tạo lớp đối tượng cài đặt gt Serialization 
2.3. Đặc tả và cài đặt  g.tiếp cho đối tượng trên Server
4. Xây dựng chương trình Client
5. Xây dựng chương trình cho đối tượng Server trên Server
Output
Chuyển đối tượng theo tham chiếu
Khi đối tượng cần chuyển đi quá lớn -> đóng gói chuyển qua mạng sẽ ảnh hưởng tốc độ thực thi ct.
Khi trình chủ có thể tham chiếu và xử lý trực tiếp đối tượng đang nằm trên máy client -> chuyển đối tượng theo tham chiếu từ chủ đến khách -> cơ chế callback.

Thiết kế ct chuyển đổi đối tượng qua mạng theo tham chiếu
Đặc tả giao tiếp cho đối tượng Client
Đặc tả giao tiếp cho đối tượng Server
Cài đặt chi tiết cho đối tượng Client
Cài đặt chi tiết cho đối tượng Server
Xây dựng chương trình cho đối tượng Server trên Server và đăng ký với Registry
Thiết kế chương trình Client gọi phương thức của đối tượng Server
Tạo lớp trung gian cho cả 2 đối tượng Server và CLient
Khởi động rmiregistry
Cài đặt đối tượng trên Server
Chạy trình khách trên Client
1,2. Đặc tả g.tiếp cho đối tượng Client, Server
3.4. Cài đặt chi tiết cho đối tượng Client, Srv 
5. Xây dựng chương trình cho đối tượng Server trên Server và đăng ký với Registry
6. Thiết kế chương trình Client gọi phương thức của đối tượng Server
7. Tạo lớp trung gian cho cả 2 đối tượng Server và Client. 8. Khởi động rmiregistry
9. Cài đặt đối tượng trên Server 10. Chạy trình khách trên Client 
Note
Java cho phép 1 đối tượng có thể cài đặt một lúc nhiều Interface.
Nếu đối tượng cài cả Remote và Serialization thì đối tượng được truyền theo tham chiếu hay tham trị?
Đăng ký nhiều đối tượng với RMIRegistry
Test multiObject
Quản lý nhiều đối tượng với RMIRegistry
Trong java cũng cho phép ta lấy về danh sách các đối tượng mà rmiregistry đang nắm giữ
Factory Object
Khi nhiều đối tượng được tạo ra và được đăng ký với rmiregistry => Hạn chế:
rmiregistry phải quản lý nhiều đối tượng.
Trình khách phải nhớ các tên đối tượng.
Giải pháp: Java cho phép xây dựng:
Một đối tượng được đăng ký rmiregistry và chỉ dùng để tạo ra các đối tượng con khác gọi là Factory object: có thể coi
là xưởng chế tác và cung cấp các đối tượng con cho máy khách
Factory Object là cách thức giao tiếp khá thông dụng, được đưa vào trong EJB của Java

Mô hình hoạt động của Factory Object
Cài đặt ứng dụng Factory Object
Có đối tượng Factory dùng để tạo ra hai đối tượng con: 
FactoryServerImpl:
createNews(): tạo ra đối tượng News khi trình khách gọi
createTimer(): tạo ra đối tượng Timer khi trình khách gọi
NewsImpl
getTodayNews() dùng để lấy về thông tin
TimerImpl. 
getCurrentTime(): dùng để lấy ngày giờ hiên tại trên Server
Mô hình 
Các bước triển khai
Đặc tả giao tiếp và cài đặt đối tượng Timer
Đặc tả giao tiếp và cài đặt đối tượng New
Đặc tả và cài đặt đối tượng FactoryService
Xây dựng trình cài đặt và đăng ký đối tượng FactoryService với rmiregistry
Server_setup: tạo đt FactoryService, đk với rmi
Xây dựng trình khách triệu gọi đối tượng trên máy chủ. Client_Setup:
- liên hệ với đt FactoryService,
- y/c tạo 2 đt News và Timer (createNews, createTimer)
- gọi phương thức của 2 đt (getTodayNews(), getCurrentTime()
Biên dịch và chạy chương trình
Đặc tả g.tiếp cho News, Timer, FactoryService
Cài đặt cho News, Timer
Cài đặt cho FactoryService
Xây dựng trình Server, Client
Output
Static Method Invocation
Cách gọi hàm tĩnh: 
Đối tượng ở xa phải cung cấp lớp giao tiếp của bản thân đối tượng
Trình khách lấy tham chiếu đến đối tượng bằng hàm Naming.lookup().
Trình khách gọi các phương thức của đối tượng chủ. 
Trình khách sẽ dựa vào lớp giao tiếp này để chuyển kiểu đối tượng dạng tường minh (sau khi nhận được) Ex: 
FactoryService objFac= (FactoryService) Naming.lookup("rmi://localhost/Factory");
-> Khi đó có thể truy xuất đối tượng ở xa theo cách thông thường (local)
Dynamic Method Invocation
Nếu không có lớp giao tiếp của đối tượng từ xa:
Không thể chuyển kiểu
Dùng kỹ thuật reflect để triệu gọi phương thức động.
Trình khách lấy tham chiếu đến đối tượng bằng hàm Naming.lookup() dạng tổng quát Object, ex
Object obj= Naming.lookup("rmi://localhost/Obj");
Sau đó, khảo sát đối tượng
Truy tìm xuất xứ class: getclass()
Truy tìm phương thức của đối tượng: getMethod()
Thực thi phương thức bên trong đối tượng: invoke()
Đặc tả và cài đặt một Remote Interface
Xây dựng chương trình trên Server
/* Server_Setup.java*/
public class Server_Setup{
public static void main(String[] args) throws Exception {
//tao doi tuong Calculator  thuc su
Friend f= new FriendImpl();
//thông báo sự hiện diện f là đối tượng có khả năng Remote cho JVM
UnicastRemoteObject.exportObject (f);
System.out.println(“Friend waitting…..");
//đăng ky doi tuong với trình quản lý rmi
Naming.bind("rmi://localhost/Friend",f);
}

 Xây dựng chương trình trên Client
/* Client_Setup.java*/
import java.rmi.*;
import java.lang.reflect.*;
public class Client_Setup {
public static void main(String[] args) throws Exception {
System.out.println("Finding Object … ");
Object f= Naming.lookup ("rmi://localhost/Friend");
// Truy tìm class
Class cls=f.getclass();
Class [] TypeCls = new Class [] {String.class};
Method mthd = f.getMethod(“greeting”, Typecls);
Object [] arg = new Object [] {“Quoc Anh”};
String result = (String) mthd.invoke(f, arg);
System.out.println(result); 
}
  }
RMIRegistry và vấn đề Firewall
Kết nối giữa trình khách và RMIRegistry bị chặn bởi firewall:
Giải pháp
Yêu cầu admin (of firewall) cung cấp 1 số cổng để sử dụng
Sử dụng cơ chế trung gian thông qua cổng 80 của dịch vụ WebServer để truy xuất và gọi đối tượng: cơ chế Tunneling
(cần mô hình lập trình Web services & nghi thức giao tiếp SOAP dựa trên XML)
Tunneling
Web services & SOAP
Web services:
cung cấp cơ chế triệu gọi các đối tượng từ xa thông qua web và giao thức HTTP. 
Cung cấp cơ chế truyền tải định dạng đối tượng theo XML.
 Giao thức SOAP (Simple Object Access Protocol): 
hỗ trợ Web services. 
được định nghĩa dựa trên giao thức HTTP, 
cho phép dữ liệu chuyển đi bằng HTTP và định dạng chuẩn theo XML. 
Các lời gọi hàm, tham số, dữ liệu đều được chuyển thành dạng XML => dễ dàng xử lý bởi bất cứ ngôn ngữ nào 
Lập trình phân tán với CORBA
Khác với RMI:
Các đối tượng được xây dựng trên nền CORBA được áp dụng cho nhiều ngôn ngữ khác nhau.
Bộ phát triển J2SDK cũng hỗ trợ RMI-CORBA, cho phép một đối tượng Java gọi một đối tượng CORBA sử dụng hai cách tiếp cận khác nhau
CORBA (Common Object Request Broker Architecture): kiến trúc môi giới gọi các đối tượng thông dụng -  là ngôn ngữ đặc tả giao tiếp (Interface Definition Language - IDL):
Các đối tượng viết bằng ngôn ngữ khác nhau có thể triệu gọi lẫn nhau theo mô hình đối tượng phân tán
Triệu gọi đối tượng Corba thông qua ORB
Giao tiếp giữa trình khách và đối tượng Corba trên Server
Giao tiếp giữa trình khách và đối tượng Corba trên Server
a. Phần cài đặt đối tượng Corba trên máy chủ:
Đặc tả đối tượng X bằng IDL của Corba
Chuyển đặc tả X thành một ngôn ngữ cụ thể (dùng 1 trình biên dịch tương ứng:
 ex: idlj.exe -> java; idl2cpp.exe-> C++)
Trình biên dịch sẽ tạo ra lớp _Skel
Cài đặt đối tượng băng ngôn ngữ (Java)
b. Phần kết nối với đối tượng khách:
Sử dụng IDL của X y/c trình biên dịch tạo ra _Stub (trình biên dịch tương ưng với trình khách)
Trình khách gọi đối tượng chủ (-> _Stub -> ORB khách -> IIOP -> ORB chủ -> _Skel -> CorbaObject
Ex, hello
Tạo file đặc tả Hello.idl, ex:
interface Hello {
string sayHello(); };
Biên dịch: idlj –fserver Hello.idl
Có 3 file được tạo ra: 
HelloOperation.java: File chuyển đặc tả IDL thành đặc tả interface của Java
Hello.java: File chuyển lớp giao tiếp đối tượng kiểu Java thành lớp giao tiếp đối tượng đặc thù trong Corba
HelloPOA.java: File chứa lớp cài đặt đối tượng Corba
Tạo đối tượng Corba Hello: HelloServant.java
Biên dịch: javac *.java
HelloOperation.class, Hello.class: các lớp trung gian
HelloServant.class: đối tượng corba (kế thừa HelloPOA)

Summary
1. Để xây dựng đối tượng ở xa ta phải:
Thiết lập một giao tiếp của đối tượng. 
Cài đặt giao tiếp của đối tượng, 
Sau đó tạo ra các lớp trung gian _Stub và _Skel tương ứng. 
Giao tiếp ở trình khách với đối tượng chủ thông qua lớp _Stub.
Giao  tiếp của đối tượng chủ với với trình khách thông qua lớp _Skel
Đối tượng chủ phải đăng ký tên với tring rmiRegistry để trình khách có thể truy tìm tham chiếu của đối tượng từ xa (Naming.bind)
Trình  khách truy tìm đối tượng theo tên (Naming.lookup) và gọi phương thức của đối tượng.
2. Chuyển tham số trong RMI:
Truyền dữ liệu giữa trình khách và đối tượng trên máy chủ có thể thông qua tham trị và tham chiếu:
Tham chiếu: các đối tượng phải cài đặt giao tiếp Remote
Tham trị: các đối tượng phải cài đặt giao tiếp Serialization
Tham chiếu từ đối tượng chủ đến đối tượng trên trình khách: tham chiếu ngược
(trình chủ có thể chủ động gọi và điều khiển trình khách)

{ 0 nhận xét... read them below or add one }

Đăng nhận xét