[Java] Khái niệm về RMI trong Java và cách sử dụng RMI

93
Chapter 9 RMI Remote Method Invocation GV: Nguyễn Thị Thanh Vân

description

Check out my blog : http://anhthienad.com/blog

Transcript of [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

Page 1: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

Chapter 9RMI Remote Method Invocation

GV: Nguyễn Thị Thanh Vân

Page 2: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

2Java Simplified / Session 22 / 2 of 45

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

Nội dung

Page 3: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

3Java Simplified / Session 22 / 3 of 45

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

Page 4: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

4Java Simplified / Session 22 / 4 of 45

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.

Giới thiệu

Page 5: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

5Java Simplified / Session 22 / 5 of 45

Mô hình triệu gọi các đối tượng từ xa

Computer C

C1

Computer AA2

A1

Computer B

B3

B2B2

Page 6: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

6Java Simplified / Session 22 / 6 of 45

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 và RPC (Remote Procedure Calling)

Page 7: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

7Java Simplified / Session 22 / 7 of 45

RMI – Client/Server

Client Server

Client (nơi gọi phương thức của các đối tượng ở xa) Server (nơi đối tượng thật sự được cài đặt để thực thi mã lệ

nh của phương thức).

Page 8: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

8Java Simplified / Session 22 / 8 of 45

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.

Mục đích của RMI

Page 9: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

9Java Simplified / Session 22 / 9 of 45

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

Vấn đề phát sinh

Page 10: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

10Java Simplified / Session 22 / 10 of 45

Đố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

Giải pháp

Page 11: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

11Java Simplified / Session 22 / 11 of 45

Lớp trung gian Stub và Skeletion

Computer C

C1

Computer AA2

A1

Computer B

B1

C1_StubB

1_S

tub

B1_

Ske

l

C1_

Ske

l

Page 12: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

12Java Simplified / Session 22 / 12 of 45

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 Server (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

Page 13: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

13Java Simplified / Session 22 / 13 of 45

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. Quá trình diễn ra như sau:

Lớp trung gian Stub và Skeletion

a,bc

Page 14: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

14Java Simplified / Session 22 / 14 of 45

Kiến trúc của RMI

The Stub and Skeleton layer, which intercepts method calls made by the client to the interface reference variable and redirects these calls to a remote RMI service.

The Remote Reference layer understands how to interpret and manage references made from clients to the remote service objects.

The Transport layer, which is based on TCP/IP connections between machines in a network. It provides basic connectivity, as well as some firewall penetration strategies.

Page 15: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

15Java Simplified / Session 22 / 15 of 45

Kiến trúc của RMI

Page 16: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

16Java Simplified / Session 22 / 16 of 45

Quá trình hoạt động của RMI

Registry

RMI Server

Skeleton

Remote Machine (Server)

Stub

RMI Client

Local Machine (Client)

call

return

bind

lookup

Page 17: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

17Java Simplified / Session 22 / 17 of 45

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)

Quá trình hoạt động của RMI

Page 18: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

18Java Simplified / Session 22 / 18 of 45

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ụ,

Trình (bộ quản lý)đăng ký Registry

Client

Server

Registry

Page 19: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

19Java Simplified / Session 22 / 19 of 45

Hoạt động của Stub, Skeleton

Client gọi một phương thức từ xa, lời gọi này được chuyển tiếp đến Stub.

Stub có nhiệm vụ gửi tiếp lời yêu cầu này đến Skeleton phía server bằng cách Stub mở một socket đến server, đóng gói các tham số:

• Gói nhận dạng đối tượng từ xa• Gói phương pháp nhận dạng

truyền luồng dữ liệu này đến Skeleton. Skeleton chứa đựng một phương thức n

hận các lời yêu cầu từ xa, mở gói tham số, gọi hàm thực sự trên server để tính toán trả kết quả về Stub phía client.

Page 20: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

20Java Simplified / Session 22 / 20 of 45

Giao tiếp Remote

Giao tiếp này không khai báo bất kỳ phương thức nào. Các phương thức được

khai báo trong phương thức này là các giao tiếp có thể được gọi từ xa.

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 là đ/c IP và số hiêu cổng của Server nơi bộ Registry đang chạy.

◦ Objectname là tên tự đặt, các ct 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.

Các lớp và các giao tiếp trong gói java.rmi

Page 21: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

21Java Simplified / Session 22 / 21 of 45

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

Page 22: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

22Java Simplified / Session 22 / 22 of 45

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

Page 23: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

23Java Simplified / Session 22 / 23 of 45

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.

Naming class - methods

Page 24: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

24Java Simplified / Session 22 / 24 of 45

RemoteObject class

UnicastRemoteObject

UnicastRemoteServer

RemoteServer

RemoteObject

ObjectUnicastRemote

Server Remote

RemoteObject class Các đối tượng từ xa là thể hiện của các lớp con

của RemoteObject. RemoteServer class

là lớp con của lớp RemoteObject; là lớp cha của lớp UnicastRemoteObject.

UnicastRemoteObject class là một lớp con cụ thể của lớp RemoteServer. Để tạo ra một đối tượng ở xa:

ta phải thừa kế lớp UnicastRemoteServer khai báo lớp này thực thi giao tiếp Remote

Phương thức exportObject(Object): làm cho máy ảo Java nhận diện được đối tượng Object.

Page 25: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

25Java Simplified / Session 22 / 25 of 45

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.

Giao tiếp Registry

Page 26: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

26Java Simplified / Session 22 / 26 of 45

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 Server5. 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 server8. Chạy chương trình phía client.

Các bước thiết kế và cài đặt RMI

Page 27: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

27Java Simplified / Session 22 / 27 of 45

Triệu gọi đối tượng RMI giữa trình khách và đối tượng chủ ở xa

Ex, Cài đặt chương trinhg cộng 2 số nguyên

Page 28: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

28Java Simplified / Session 22 / 28 of 45

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.javaimport java.rmi.*;public interface Calculator extends Remote{public int addNum(int x,int y) throws RemoteException;}

Biên dịch

1. Đặc tả một Remote Interface (at Srv)

Page 29: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

29Java Simplified / Session 22 / 29 of 45

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.*;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

2. Hiện thực Remote Interface

Page 30: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

30Java Simplified / Session 22 / 30 of 45

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 gianC:\RMI>rmic CalculatorImpl

Kết quả◦CalculatorImpl_Stub.class◦CalculatorImpl_Skel.class //ko

3. Sinh trung gian Stub và Skeleton

Page 31: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

31Java Simplified / Session 22 / 31 of 45

/* CalServer.java*/public class CalculatorServer{public static void main(String[] args) throws AlreadyBoundException {

try{//tao doi tuong Calculator thuc suCalculatorImpl c= new CalculatorImpl();System.out.println("Exporting Calculator ! ");//thông báo sự hiện diện c là đô%i tượng có kha* năng Remote cho JVMUnicastRemoteObject.exportObject (c);//đăng ky doi tuong với trình qua*n lý rmiNaming.bind("rmi://localhost/Van",c);System.out.println("Register Calculator!");

} catch(Exception e) { System.out.println(e); }

}}

Biên dịch

4. Xây dựng chương trình trên Server

Page 32: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

32Java Simplified / Session 22 / 32 of 45

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ầ8n truy xuầ%t theo tênCalculator c= (Calculator)Naming.lookup ("rmi://localhost/Van");// goi phuong thuc cua doi tuongSystem.out.println(c.addNum(5,10));

} catch(Exception e) { System.out.println(e); } }

} Biên dịch

5. Xây dựng chương trình trên Client

Page 33: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

33Java Simplified / Session 22 / 33 of 45

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

6. Kích hoạt bộ đăng ký

Page 34: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

34Java Simplified / Session 22 / 34 of 45

C:\RMI>java CalculatorServerExporting 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.

7. K.động các đối tượng phía Server

Page 35: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

35Java Simplified / Session 22 / 35 of 45

C:\RMI>java CalculatorClientFinding 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

8. Chạy chương trình phía Client

Page 36: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

36Java Simplified / Session 22 / 36 of 45

Test

Page 37: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

37Java Simplified / Session 22 / 37 of 45

Review

Page 38: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

38Java Simplified / Session 22 / 38 of 45

Dựa vào JVM ta có thể tạo tùy ý các máy tính ảo (cho các ct chạy trên các cửa sổ DOS khác nhau) giao tiếp với nhau giả lập mạng.

Đặc điểm: cùng IP, cùng chung thư viện Java, cùng 1 chính sách bảo mật -> dễ vận hành.

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

Lưu ý cách vận hành

Page 39: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

39Java Simplified / Session 22 / 39 of 45

RMI trên JVM

Page 40: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

40Java Simplified / Session 22 / 40 of 45

RMI trên máy thực

cài đặt của đối tượng

Page 41: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

41Java Simplified / Session 22 / 41 of 45

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:LocateRegistry.createRegistry(1234);Naming.bind("rmi://localhost:1234/myCal",c2);

Tự tạo bộ đăng kí (ko dùng rmiregistry.exe

LocateRegistry.createRegistry(1099);Calculator cal = new CalculatorImpl();System.out.println("Exporting Calculator ! ");UnicastRemoteObject.exportObject(cal);System.out.println("Registering object …");Naming.bind("rmi://localhost/myCal", cal);System.out.println(“Register Calculator");System.out.println("Waiting for client

request…");

Page 42: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

42Java Simplified / Session 22 / 42 of 45

Các lớp và phạm vi sử dụng

Các lớp được tạo ra trong RMI

Server Client

Cal.class

CalImpl.class

CalServer.class

CalImpl_Stub.clas

s

CalImpl_Skel.clas

s

Cal.class

CalClient.class

CalImpl_Stub.clas

s

Page 43: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

43Java Simplified / Session 22 / 43 of 45

CLASSPATH:◦Java dựa vào biến môi trường CLASSPATH để truy tìm các tập tin .class. ◦Nếu CLASSPATH chỉ sai đường dẫn tới lỗi xảy ra: java.lang.ClassNotFoundException:ClassName◦Để thay đổi giá trị cho CLASSPATH, dùng lệnh: Set Classpath. Ví dụ:Set Classpath=.;C:\RMI\

Biến Classpath và tùy chọn Codebase

Page 44: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

44Java Simplified / Session 22 / 44 of 45

Codebase (HTML)◦ [CODEBASE = URLDirectory] //xác định vị trí tệp từ xa

◦ Codebase cho phép nạp tự động các lớp _Stub.class 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

Biến Classpath và tùy chọn Codebase

Page 45: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

45Java Simplified / Session 22 / 45 of 45

Nạp stub từ xa xuống client thông qua web server

(IP: 172.16.11.12

1. Server đăng ký đối tượng với rmi registry, yêu cầu rmi registry truy tìm đối stub thông qua web server

2. RMI registry nhận yêu cầu, truy tìm stub trong CLASSPATH nhưng không có, theo sự chỉ dẫn của server nó tìm đến web server để lấy stub về, đồng thời ghi nhớ lại đường dẫn đến web server

3. Client yêu cầu rmi registry trả về tham chiếu đối tượng, nhưng client chưa có stub, rmi registry cho nó biết địa chỉ webserver để nó lên download stub về

4. Client yêu cầu webserver cung cấp stub5. Client sử dụng stub đó để giao tiếp với serverrmiregistry sẽ hướng dẫn máy khách tự động nạp lớp _Stub từ địa chỉ codebase: http://172.16.11.12/myclass/

Page 46: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

46Java Simplified / Session 22 / 46 of 45

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ệ:

SecurityManagerKhi 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

Page 47: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

47Java Simplified / Session 22 / 47 of 45

Nạp file từ xa và security policy phía client

/* CalculatorClient.java*/import java.rmi.*;public class CalculatorClient {public static void main(String[] args){

try{System.setSecurityManager(new RMISecurityManager());System.out.println("Finding Object … ");// tìm đối tượng cần truy xuất theo tênCalculator c= (Calculator)Naming.lookup ("rmi://localhost/Van");// goi phuong thuc cua doi tuongSystem.out.println(c.addNum(5,10));

} catch(Exception e) { System.out.println(e); } }}

Page 48: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

48Java Simplified / Session 22 / 48 of 45

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.policyMở 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};

Nạp file từ xa và security policy phía client

Page 49: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

49Java Simplified / Session 22 / 49 of 45

Đố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 tham số trong RMI

Page 50: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

50Java Simplified / Session 22 / 50 of 45

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

Chuyển đối tượng theo tham trị

Page 51: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

51Java Simplified / Session 22 / 51 of 45

RMI_Ball

Ex: truyền tham số qua mạng sử dụng giao tiếp Serializable

Page 52: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

52Java Simplified / Session 22 / 52 of 45

Output

Page 53: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

53Java Simplified / Session 22 / 53 of 45

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.

Chuyển đối tượng theo tham chiếu

Page 54: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

54Java Simplified / Session 22 / 54 of 45

1. Đặc tả giao tiếp cho đối tượng Client

2. Đặc tả giao tiếp cho đối tượng Server

3. Cài đặt chi tiết cho đối tượng Client

4. Cài đặt chi tiết cho đối tượng Server

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

Thiết kế ct chuyển đổi đối tượng qua mạng theo tham chiếu

Page 55: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

55Java Simplified / Session 22 / 55 of 45

1,2. Đặc tả g.tiếp cho đối tượng Client, Server

public interface AtServer extends Remote {//Tiếp nhận tham chiếu đến đối tượng AtClient trên trình

kháchpublic void registerClient(AtClient c) throws

RemoteException;//Cung cầ%p dịch vụ cho các trình kháchpublic void callServerMethod(String

message)throws RemoteException;}

import java.rmi.*; public interface AtClient extends Remote { //pt này được gọi bở*i đ.tượng AtServer trên máy chu*public void callClientMethod(String message) throws RemoteException;}

Page 56: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

56Java Simplified / Session 22 / 56 of 45

3.4. Cài đặt chi tiết cho đối tượng Client, Srv

public class AtClientImpl implements AtClient { public void callClientMethod(String mes) throws

RemoteException {System.out.println(mes);

}}public class AtServerImpl implements AtServer { AtClient client;//lưu giữ tham chiê%u đê%nđô%i tượng trên máy

khách // trình khách triệu gọi pt đê* đăng ký AtClient với

trình chu*public void registerClient(AtClient c) throws

RemoteException { client = c; }public void callServerMethod(String mes)throws

RemoteException { System.out.println(mes); for (int i=1; i<10; i++){ String msg= "Server response "+ i; //triệu gọi phưởng thức cu*a đô%i tượng chạy trên máy khách client.callClientMethod(msg); } } }

Page 57: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

57Java Simplified / Session 22 / 57 of 45

5. Xây dựng chương trình cho đối tượng Server trên Server và đăng ký với Registry

public class Server_Setup { public static void main(String args[]) throws

Exception { //Khở*i tạo đô%i tượng chu*AtServer server=new AtServerImpl();//thông báo kha* năng giao tiê%p được từ xaUnicastRemoteObject.exportObject(server); //Đăng ký đô%i tượng với RMINaming.bind("rmi://localhost/serverobject",server);System.out.println("Waiting for clientrequest ...");

}}

Page 58: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

58Java Simplified / Session 22 / 58 of 45

6. Thiết kế chương trình Client gọi phương thức

của đối tượng Server

public class Client_Setup { public static void main(String args[]) throws

Exception {//Khở0i tạo đố4i tượng kháchAtClient client=new AtClientImpl();//thống báo kha0 năng giao tiế4p được từ xaUnicastRemoteObject.exportObject(client); AtServer server=

(AtServer)Naming.lookup("rmi://localhost/serverobject");

//Truyế=n t.chiế4u cu0a AtClient từ trình khách lến chu0

//Trình chu0 ko cầ=n .lookup đế0 truy tìm tc đế4n AtClientserver.registerClient(client);server.callServerMethod("Client ContactServer");

}}

Page 59: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

59Java Simplified / Session 22 / 59 of 45

7. Tạo lớp trung gian cho cả 2 đối tượng Server và

Client. 8. Khởi động rmiregistry

Page 60: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

60Java Simplified / Session 22 / 60 of 45

9. Cài đặt đối tượng trên Server

10. Chạy trình khách trên Client

Page 61: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

61Java Simplified / Session 22 / 61 of 45

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ị?

Note

Page 62: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

62Java Simplified / Session 22 / 62 of 45

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ự)

Tuần tự hóa đối tượng

Page 63: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

63Java Simplified / Session 22 / 63 of 45

Serialization

Page 64: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

64Java Simplified / Session 22 / 64 of 45

Java cung cấp khả năng ghi toàn bộ đối tượng xuống một tập tin. Sau đó có thể đem tập tin chứa đối tượng đi khắp nơi nếu cần thì khôi phục đối tượng về trạng thái ban đầu.

Đối tượng trong bộ nhớ có thể quan hệ chằng chịt với nhau nhưng khi được ghi xuống tập tin thì bắt buộc phải trải phẳng đối tượng theo thứ tự.

Tuần tự hóa đối tượng

Page 65: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

65Java Simplified / Session 22 / 65 of 45

Tuần tự hóa đối tượng

Page 66: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

66Java Simplified / Session 22 / 66 of 45

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

khả tuần tự hóa

Page 67: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

67Java Simplified / Session 22 / 67 of 45

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ố4c 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 streamObjectInputStream 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(); }}

Example Serialization

class Junk implements Serializable { String str; public Junk(String s) { str = s; } public String toSt(){ return str; }}

Page 68: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

68Java Simplified / Session 22 / 68 of 45

Đăng ký nhiều đối tượng với RMIRegistry

Page 69: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

69Java Simplified / Session 22 / 69 of 45

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ữ

Quản lý nhiều đối tượng với RMIRegistry

String hostAdd = "127.0.0.1";//kê%t nô%i với bộ RMIRegistryRegistry reg = LocateRegistry.getRegistry(hostAdd);//Lấy danh sách các đối tượng vềString Objlist[] = reg.list();

Page 70: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

70Java Simplified / Session 22 / 70 of 45

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

Factory Object

Page 71: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

71Java Simplified / Session 22 / 71 of 45

Mô hình hoạt động của Factory Object

1. Đối tượng Factory Object đăng ký tên mình với rmiregistry.

2. Trình khách liên hệ với rmiregistry để lấy về tham chiếu đến đối tượng Factory Object

3. Trình khách triệu gọi đối tượng Factory Object y/c tạo ra và cho phép tham chiếu đến Object A or Object B

4. Đối tượng chủ tạo ra và trả về tham chiếu của Object A, Object B theo yêu cầu của trình khách

5. Dựa vào tham chiếu do Factory Object trả về trình khách thực hiện lời gọi đến Object A hoặc Object B

Page 72: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

72Java Simplified / Session 22 / 72 of 45

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ài đặt ứng dụng Factory Object

Page 73: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

73Java Simplified / Session 22 / 73 of 45

1. Đặc tả giao tiếp và cài đặt đối tượng Timer2. Đặc tả giao tiếp và cài đặt đối tượng New3. Đặc tả và cài đặt đối tượng FactoryService4. Xây dựng trình cài đặt và đăng ký đối tượng

FactoryService với rmiregistryServer_setup: tạo đt FactoryService, đk với rmi

5. 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()

6. Biên dịch và chạy chương trình

Các bước triển khai

Page 74: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

74Java Simplified / Session 22 / 74 of 45

Đặc tả g.tiếp cho News, Timer, FactoryService

package Factory;public interface Timer extends Remote{public Date getCurrentTime() throws

RemoteException; }

package Factory;public interface News extends Remote{public String getTodayNews() throws

RemoteException; }

package Factory;public interface FactoryService extends Remote{public News createNews() throws RemoteException;public Timer createTimer() throws

RemoteException;}

Page 75: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

75Java Simplified / Session 22 / 75 of 45

Cài đặt cho News, Timer

package Factory;public class NewsImp implements News{ String newslist [] = {"The first News", "The second News", "The third News"};static int index=0;public String getTodayNews() throws RemoteException {System.out.println("Client request news");index++;if (index >2) index=0;return newslist[index];}}package Factory;public class TimerImp implements Timer{public Date getCurrentTime() throws RemoteException {

System.out.println("Client request time ");return new Date();

}}

Page 76: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

76Java Simplified / Session 22 / 76 of 45

Cài đặt cho FactoryService

package Factory;public class FactoryServiceImp implements FactoryService{News newsobject = new NewsImp();Timer timerobject = new TimerImp();public FactoryServiceImp(){try {UnicastRemoteObject.exportObject(newsobject);UnicastRemoteObject.exportObject(timerobject);

} catch (RemoteException e) {e.printStackTrace();System.out.println(e); }

}public News createNews() throws RemoteException {return newsobject;

}public Timer createTimer() throws RemoteException{return timerobject;

}}

Page 77: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

77Java Simplified / Session 22 / 77 of 45

Xây dựng trình Server, Client

public class Server_Setup {public static void main(String[] args) throws Exception {System.out.println("Factory Service ready...");FactoryService obj = new FactoryServiceImp();UnicastRemoteObject.exportObject(obj);Naming.bind("rmi://localhost/Factory", obj);

}}

public class Client_Setup {public static void main(String[] args) throws Exception{FactoryService objFac=(FactoryService)

Naming.lookup("rmi://localhost/Factory");News news = objFac.createNews();Timer timer= objFac.createTimer();System.out.println("1. Curent time: " +

timer.getCurrentTime());System.out.println("1. There is news: " +

news.getTodayNews());}

}

Page 78: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

78Java Simplified / Session 22 / 78 of 45

Output

Page 79: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

79Java Simplified / Session 22 / 79 of 45

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)

Static Method Invocation

Page 80: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

80Java Simplified / Session 22 / 80 of 45

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, exObject 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()

Dynamic Method Invocation

Page 81: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

81Java Simplified / Session 22 / 81 of 45

Đặc tả và cài đặt một Remote Interface

// Friend.javaimport java.rmi.*;public interface Friend extends Remote {public String greeting(String name) throws RemoteException;}

// Friend.javapublic class FriendImp implements Friend{public String greeting(String name) throws RemoteException; return (“Hi " + name + “ Nice to meet you ");

}}

Page 82: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

82Java Simplified / Session 22 / 82 of 45

/* Server_Setup.java*/public class Server_Setup{public static void main(String[] args) throws Exception {

//tao doi tuong Calculator thuc suFriend f= new FriendImpl();//thông báo sự hiện diện f là đô%i tượng có kha* năng Remote cho JVMUnicastRemoteObject.exportObject (f);System.out.println(“Friend waitting…..");//đăng ky doi tuong với trình qua*n lý rmiNaming.bind("rmi://localhost/Friend",f);}

Xây dựng chương trình trên Server

Page 83: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

83Java Simplified / Session 22 / 83 of 45

/* 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 classClass 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); } }

Xây dựng chương trình trên Client

Friend f= (Friend) Naming.lookup ("rmi://localhost/Friend");String result = f.greeting(“Quoc Anh”);

Page 84: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

84Java Simplified / Session 22 / 84 of 45

Kết nối giữa trình khách và RMIRegistry bị chặn bởi firewall:

RMIRegistry và vấn đề Firewall

Page 85: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

85Java Simplified / Session 22 / 85 of 45

Yêu cầu admin (of firewall) cung cấp 1 số cổng để sử dụngSử 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)

Giải pháp

Page 86: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

86Java Simplified / Session 22 / 86 of 45

Tunneling1. Đối tượng Object đăng ký với RMIRegistry.2. Máy khách gửi y/c truy xuất Object thông qua giao

thức http đến Webserver.3. Web server y/c một đối tượng trung gian Servlet

trên máy chủ (server) để xử lý 4. Servlet liên hệ tới RMIRegistry để lấy tham chiếu

của Object 5. Servlet triệu gọi Object 6. Servlet trả về kết quả cho Webserver7. Cuối cùng Webserver trả kết quả về cho trình khách

Page 87: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

87Java Simplified / Session 22 / 87 of 45

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

Web services & SOAP

Page 88: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

88Java Simplified / Session 22 / 88 of 45

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

Lập trình phân tán với CORBA

Page 89: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

89Java Simplified / Session 22 / 89 of 45

Triệu gọi đối tượng Corba thông qua ORB

ORB giao tiếp với đối tượng thông qua các thông tin được đặc tả theo IDL

Page 90: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

90Java Simplified / Session 22 / 90 of 45

Giao tiếp giữa trình khách và đối tượng Corba trên Server

Page 91: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

91Java Simplified / Session 22 / 91 of 45

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 CorbaChuyể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 _SkelCà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

Giao tiếp giữa trình khách và đối tượng Corba trên Server

Page 92: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

92Java Simplified / Session 22 / 92 of 45

Page 93: [Java] Khái niệm về RMI trong Java và cách sử dụng RMI

93Java Simplified / Session 22 / 93 of 45

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.

o Giao tiếp ở trình khách với đối tượng chủ thông qua lớp _Stub.o 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:

o Tham chiếu: các đối tượng phải cài đặt giao tiếp Remoteo 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)

Summary