1. Trang chủ
  2. » Luận Văn - Báo Cáo

Lập trình mạng 9 RMI Remote Method Invocation

93 869 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 93
Dung lượng 2,02 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

Chapter 9 RMI

Remote Method Invocation

GV: Nguyễn Thị Thanh Vân

1

Trang 2

 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

Trang 3

Java 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

3

Trang 4

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

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

4

Trang 5

Java Simplified / Session 22 / 5 of 45

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

Computer C

C1

Computer A

A2 A1

Computer B

B3

B2 B2

5

Trang 6

 Like RPC ,RMI has the following similarities

◦ Remote calls can be made

◦ Client/server contract based on interface

◦ RMI: chỉ hỗ trợ các ứng dụng được viết bằng Java

RMI và RPC (Remote Procedure Calling)

6

Trang 7

Java Simplified / Session 22 / 7 of 45

RMI – 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).

7

Trang 8

 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

8

Trang 9

Java Simplified / Session 22 / 9 of 45

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

9

Trang 10

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

10

Trang 11

Java Simplified / Session 22 / 11 of 45

Lớp trung gian Stub và Skeletion

Computer C

C1

Computer A

A2 A1

Trang 12

 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

12

Trang 13

Java 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,b c 13

Trang 14

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

14

Trang 15

Java Simplified / Session 22 / 15 of 45

Kiến trúc của RMI

15

Trang 16

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

Registry

RMI Server Skeleton

Remote Machine (Server)

Stub RMI Client

Local Machine (Client)

Trang 17

Java 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

17

Trang 18

 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

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

18

Trang 19

Java 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

nhậ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.

19

Trang 20

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

20

Trang 21

Java Simplified / Session 22 / 21 of 45

 Lớp Naming cung cấp các phương thức sau:

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

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

21

Trang 22

 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

22

Trang 23

Java 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

23

Trang 24

 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.

24

Trang 25

Java 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

List() liệt kê tất cả các tên đã được đăng ký với trình đăng ký

trị mặc định là 1099.

Giao tiếp Registry

25

Trang 26

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.

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

26

Trang 27

Java 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

27

Trang 28

 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

Trang 29

Java 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

29

Trang 30

 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

Trang 31

Java 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 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

Biên dịch

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

31

Trang 32

 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

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

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

32

Trang 33

Java 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ý

33

Trang 34

C:\RMI>java CalculatorServer Exporting Calculator…

Register Calculator!

 Cũng như rmiregistry.exe, sau khi Calculator

đ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

34

Trang 35

Java Simplified / Session 22 / 35 of 45

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

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

35

Trang 36

36

Trang 37

Java Simplified / Session 22 / 37 of 45

Review

37

Trang 38

 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.

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

38

Trang 39

Java Simplified / Session 22 / 39 of 45

RMI trên JVM

39

Trang 40

RMI trên máy thực

40

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

Trang 41

Java Simplified / Session 22 / 41 of 45

 Tự tạo bộ đăng kí và tự đăng kí đối tượng:

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…" );

Trang 42

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

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

Cal.class CalImpl.class CalServer.class CalImpl_Stub.class CalImpl_Skel.class

Cal.class CalClient.class CalImpl_Stub.class

42

Trang 43

Java Simplified / Session 22 / 43 of 45

Trang 44

 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ủ)

Trang 45

Java Simplified / Session 22 / 45 of 45

Nạp stub từ xa xuống client thông qua 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 stub

5 Client sử dụng stub đó để giao tiếp với server rmiregistry 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/

Trang 46

 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

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

46

Trang 47

Java Simplified / Session 22 / 47 of 45

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

47

/* 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ên

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); }

} }

Trang 48

 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

};

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

48

Trang 49

Java 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

49

Ngày đăng: 08/07/2014, 00:56

TỪ KHÓA LIÊN QUAN

w