SlideShare a Scribd company logo
1 of 93
Chapter 9
RMI
Remote Method Invocation
GV: Nguyễn Thị Thanh Vân
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


Java Simplified / Session 22 / 2 of 2
45
Giới thiệu


Lập trình HĐT phân tán:
◦

◦



Java: giải quyết vấn đề lập trình 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
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

Java Simplified / Session 22 / 3 of 3
45
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.
Java Simplified / Session 22 / 4 of 4
45
Mô hình triệu gọi các đối tượng từ xa
Computer A

Computer B

A2

B2

A1

B2

B3

Computer C
C1

Java Simplified / Session 22 / 5 of 5
45
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

Java Simplified / Session 22 / 6 of 6
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).
Java Simplified / Session 22 / 7 of 7
45
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.

Java Simplified / Session 22 / 8 of 8
45
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
Java Simplified / Session 22 / 9 of 9
45
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

10
Java Simplified / Session 22 / 10 of 45
A2
A1

Computer B
B1_Skel

Computer A

B1_Stub

Lớp trung gian Stub và Skeletion
B1

C1_Skel

C1_Stub

Computer C
C1
11
Java Simplified / Session 22 / 11 of 45
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 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ộ.

12
Java Simplified / Session 22 / 12 of 45
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.
Quá trình diễn ra như sau:

a,b
c
13
Java Simplified / Session 22 / 13 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
14
some firewall penetration strategies.
Java Simplified / Session 22 / 14 of 45
Kiến trúc của RMI

15
Java Simplified / Session 22 / 15 of 45
Quá trình hoạt động của RMI
Remote Machine (Server)
RMI Server

 

bind



Registry

Skeleton
return

 



lookup

call

Stub

 
RMI Client



Local Machine (Client)

16
Java Simplified / Session 22 / 16 of 45
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)
17
Java Simplified / Session 22 / 17 of 45
Trình (bộ quản lý)đăng ký Registry


là một chương trình dịch vụ chạy ở hậu
Registry
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
Client
cổng mặc định 1099, có thể chỉ định một
Server
cổng khác với cổng 1099.
◦



Ví dụ: C:j2sdk1.4.0bin 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ụ,
18
Java Simplified / Session 22 / 18 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
Java Simplified / Session 22 / 19 of 45
Các lớp và các giao tiếp trong gói java.rmi
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.

20
Java Simplified / Session 22 / 20 of 45
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ó.

21
Java Simplified / Session 22 / 21 of 45
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ộ

22
Java Simplified / Session 22 / 22 of 45
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.

23
Java Simplified / Session 22 / 23 of 45
RemoteObject class
RemoteObject

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

UnicastRemote
Server

Object

RemoteServer

UnicastRemote
Object

UnicastRemote
Server
Remote
24
Java Simplified / Session 22 / 24 of 45
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.
25
Java Simplified / Session 22 / 25 of 45
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.
26
Java Simplified / Session 22 / 26 of 45
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

27
Java Simplified / Session 22 / 27 of 45
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
28
Java Simplified / Session 22 / 28 of 45
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.*;
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
29
Java Simplified / Session 22 / 29 of 45
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 //ko

30
Java Simplified / Session 22 / 30 of 45
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
31
Java Simplified / Session 22 / 31 of 45
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
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
32
Java Simplified / Session 22 / 32 of 45
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 ..Javajdk1.7.0_05bin



Không cần chạy service trên nếu có:
LocateRegistry.createRegistry(1099
);
trong main của trình Server
33
Java Simplified / Session 22 / 33 of 45
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.

34
Java Simplified / Session 22 / 34 of 45
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

35
Java Simplified / Session 22 / 35 of 45
Test

36
Java Simplified / Session 22 / 36 of 45
Review

37
Java Simplified / Session 22 / 37 of 45
Lưu ý cách vận hành
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


38
Java Simplified / Session 22 / 38 of 45
RMI trên JVM

39
Java Simplified / Session 22 / 39 of 45
RMI trên máy thực

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

40
Java Simplified / Session 22 / 40 of 45
Tự tạo bộ đăng kí (ko 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:

LocateRegistry.createRegistry(1234);
Naming.bind("rmi://localhost:1234/myCal",c2);

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…");
41
Java Simplified / Session 22 / 41 of 45
Các lớp được tạo ra trong RMI
Các

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

Server

Client

Cal.class

Cal.class

CalImpl.class

CalClient.class

CalServer.class

CalImpl_Stub.class

CalImpl_Stub.class
CalImpl_Skel.class
42
Java Simplified / Session 22 / 42 of 45
Biến Classpath và tùy chọn Codebase


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

43
Java Simplified / Session 22 / 43 of 45
Biến Classpath và tùy chọn Codebase


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

44
Java Simplified / Session 22 / 44 of 45
Nạp stub từ xa xuống client thông qua web server
2. RMI registry nhận yêu cầu,trả về tham chiếu đối tượng, nhưng
3. Client yêu cầu rmi registry truy tìm stub trong CLASSPATH
1. Server yêu cầu webserver cung của tự biết địa tìm webserver để
4. Client sử có hướng dẫn chỉ giao cấp server yêu cầu _Stub
đăng ký đối đó để dẫn tiếp với
nhưngchưa sẽ có, theotượng với rmi registry, nó chỉlớprmiweb từ
rmiregistry dụng stub sự máy khách stubserver
client không stub, rmi registry cho nó động nạp đến registry
5.
truychỉ để lấy stub http://172.16.11.12/myclass/ dẫn đến web
server download thông qua web ghi nhớ lại đường
địa tìm đối stub về, về
nó lên codebase:stub đồng thời server
server
(IP: 172.16.11.12

45
Java Simplified / Session 22 / 45 of 45
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{

46
Java Simplified / Session 22 / 46 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ê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); }
}
}
47
Java Simplified / Session 22 / 47 of 45
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: ..javajdk1.7.0_05jrelibsecurityjava.polic
y
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
};
48
Java Simplified / Session 22 / 48 of 45
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

49
Java Simplified / Session 22 / 49 of 45
Chuyển đối tượng 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

50
Java Simplified / Session 22 / 50 of 45
Ex: truyền tham số qua mạng sử dụng giao tiếp
Serializable


RMI_Ball

51
Java Simplified / Session 22 / 51 of 45
Output

52
Java Simplified / Session 22 / 52 of 45
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.


53
Java Simplified / Session 22 / 53 of 45
Thiết kế ct chuyển đổi đối tượng qua mạng theo
tham chiếu
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

54
Java Simplified / Session 22 / 54 of 45
1,2. Đặc tả g.tiếp cho đối tượng Client, Server
import java.rmi.*;
public interface AtClient extends Remote {
//pt này được gọi bởi đ.tượng AtServer trên máy chủ
public void callClientMethod(String message) throws
RemoteException;
}
public interface AtServer extends Remote {
//Tiếp nhận tham chiếu đến đối tượng AtClient trên
trình khách
public void registerClient(AtClient c) throws
RemoteException;
//Cung cấp dịch vụ cho các trình khách
public void callServerMethod(String message)throws
RemoteException;
}

55
Java Simplified / Session 22 / 55 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 chủ
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 của đối tượng chạy trên máy khách
client.callClientMethod(msg);
}
56
Java Simplified / Session 22 / 56 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 chủ
AtServer server=new AtServerImpl();

//thông báo khả năng giao tiếp được từ xa
UnicastRemoteObject.exportObject(server);

//Đăng ký đối tượng với

RMI

Naming.bind("rmi://localhost/serverobject",server);
System.out.println("Waiting for clientrequest ...");
}
}

57
Java Simplified / Session 22 / 57 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ởi tạo đối tượng khách
AtClient client=new AtClientImpl();

//thông báo khả năng giao tiếp được từ xa
UnicastRemoteObject.exportObject(client);
AtServer server=
(AtServer)Naming.lookup("rmi://localhost/serverobject");

//Truyền t.chiếu của AtClient từ trình khách lên chủ
//Trình chủ ko cần .lookup để truy tìm tc đến AtClient
server.registerClient(client);
server.callServerMethod("Client ContactServer");
}
}
58
Java Simplified / Session 22 / 58 of 45
7. Tạo lớp trung gian cho cả 2 đối tượng Server
và Client. 8. Khởi động rmiregistry

59
Java Simplified / Session 22 / 59 of 45
9. Cài đặt đối tượng trên Server
10. Chạy trình khách trên Client

60
Java Simplified / Session 22 / 60 of 45
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ị?


61
Java Simplified / Session 22 / 61 of 45
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ự)
62
Java Simplified / Session 22 / 62 of 45
Serialization

63
Java Simplified / Session 22 / 63 of 45
Tuần tự hóa đối tượng
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ự.


64
Java Simplified / Session 22 / 64 of 45
Tuần tự hóa đối tượng

65
Java Simplified / Session 22 / 65 of 45
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


66
Java Simplified / Session 22 / 66 of 45
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
class Junk implements
objectOut.writeObject(obj2); // Write object
Serializable {
objectOut.close(); // Close the output stream
String str;
ObjectInputStream objectIn = null;
public Junk(String s)
int Count = 0;
{ str = s; }
Junk object = null;
public String toSt(){
objectIn = new ObjectInputStream(
return str; }
new BufferedInputStream(new FileInputStream("b.txt")));
}
while (Count < 2) {
object = (Junk) objectIn.readObject(); Count++;
System.out.println("Object " + Count + ": " + object.toStr());
}
objectIn.close();
}
}
67
Java Simplified / Session 22 / 67 of 45
Đăng ký nhiều đối tượng với RMIRegistry

68
Java Simplified / Session 22 / 68 of 45
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ữ
String hostAdd = "127.0.0.1";
//kết nối với bộ RMIRegistry
Registry reg =
LocateRegistry.getRegistry(hostAdd);
//Lấy danh sách các đối tượng về
String Objlist[] = reg.list();

69
Java Simplified / Session 22 / 69 of 45
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á
70
Java Simplified / Session 22 / 70 of 45
Mô hình hoạt động của Factory Object
3. Đối tượngthamtạo ra đối trả về tham chiếuvề với tạo
4. Trìnhtượngchủ chiếu vàrmiregistry tênlấy của trình
2. Trình vào Factory Object đăng Factory mìnhvề y/c
1. Đối khách triệu hệ với Factoryký để Object Object
5. Dựa khách liên gọi do tượng Object trả tham
ra và cho Bđối tượnggọi đến Objectkhách or Object B
A, Object phép tham Factory Object A hoặc Object B
chiếu đến theo yêu cầu của trình
rmiregistry. hiện lời chiếu đến Object A
khách thực

71
Java Simplified / Session 22 / 71 of 45
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

72
Java Simplified / Session 22 / 72 of 45
Các bước triển khai
1.
2.
3.
4.

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

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()
73
Java Simplified / Session 22 / 73 of 45
Đặc tả g.tiếp cho News, Timer, FactoryService
package Factory;
public interface News extends Remote{
public String getTodayNews() throws RemoteException;
}
package Factory;
public interface Timer extends Remote{
public Date getCurrentTime() throws RemoteException;
}
package Factory;
public interface FactoryService extends Remote{
public News createNews() throws RemoteException;
public Timer createTimer() throws RemoteException;
}
74
Java Simplified / Session 22 / 74 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();
}
75
}
Java Simplified / Session 22 / 75 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;
}
}
76
Java Simplified / Session 22 / 76 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());
}
}
77
Java Simplified / Session 22 / 77 of 45
Output

78
Java Simplified / Session 22 / 78 of 45
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");

79
Java Simplified / Session 22 / 79 of 45
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()

80
Java Simplified / Session 22 / 80 of 45
Đặc tả và cài đặt một Remote Interface
// Friend.java
import java.rmi.*;
public interface Friend extends Remote {
public String greeting(String name) throws
RemoteException;
}
// Friend.java
public class FriendImp implements Friend{
public String greeting(String name) throws RemoteException;
return (“Hi " + name + “ Nice to meet you ");
}
}

81
Java Simplified / Session 22 / 81 of 45
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);
}
82
Java Simplified / Session 22 / 82 of 45
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);
}
Friend f= (Friend) Naming.lookup ("rmi://localhost/Friend");
}
83
String result = f.greeting(“Quoc Anh”);
Java Simplified / Session 22 / 83 of 45
RMIRegistry và vấn đề Firewall


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

84
Java Simplified / Session 22 / 84 of 45
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)

85
Java Simplified / Session 22 / 85 of 45
Tunneling
1. Đối tượng Object đăng xuất Object lấy tham chiếu
3. Máy kháchvề kết quả ký với RMIRegistry. giao
4.Web server y/c một đối tượng trungthông qua
Servlet liên gọi tới RMIRegistry để
hệ Object
2. Servlet triệugửi y/c truytrả Webservercho Servlet
5. Servlet trả Webserver cho kết quả về gian trình khách
6. Cuối cùng
7.
trên Object Webserver.
của http chủ
thức máy đến (server) để xử lý

86
Java Simplified / Session 22 / 86 of 45
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

87
Java Simplified / Session 22 / 87 of 45
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

88
Java Simplified / Session 22 / 88 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

89
Java Simplified / Session 22 / 89 of 45
Giao tiếp giữa trình khách và đối tượng
Corba trên Server

90
Java Simplified / Session 22 / 90 of 45
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

91
Java Simplified / Session 22 / 91 of 45
92
Java Simplified / Session 22 / 92 of 45
Summary
1. Để xây dựng đối tượng ở xa ta phải:
-Thiết
-Cài

lập một giao tiếp của đối tượng.

đặ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 Remote

o

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)

93
Java Simplified / Session 22 / 93 of 45

More Related Content

What's hot

Bài giảng asp.net
Bài giảng asp.netBài giảng asp.net
Bài giảng asp.netDung Duong
 
Cơ sở dữ liệu
Cơ sở dữ liệuCơ sở dữ liệu
Cơ sở dữ liệuThành Luân
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql. .
 
Bài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần MềmBài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần MềmHoài Phạm
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngHuyen Pham
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformBài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformMasterCode.vn
 
Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...
Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...
Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...Viết thuê trọn gói ZALO 0934573149
 
Bai tap testing junit…..
Bai tap testing junit…..Bai tap testing junit…..
Bai tap testing junit…..Mua Xuong
 
Báo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTTBáo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTTVu Tran
 
Phân tích thiết kế hệ thống của hàng bán điện thoại di động
Phân tích thiết kế hệ thống của hàng bán điện thoại di độngPhân tích thiết kế hệ thống của hàng bán điện thoại di động
Phân tích thiết kế hệ thống của hàng bán điện thoại di độngNguyễn Danh Thanh
 
Tìm hiểu về giao thức mạng tcp ip
Tìm hiểu về giao thức mạng tcp ipTìm hiểu về giao thức mạng tcp ip
Tìm hiểu về giao thức mạng tcp ipleduyk11
 
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTTSlide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTTHiệu Nguyễn
 
Bai tap-thuc-hanh-he-quan-tri-csdl
Bai tap-thuc-hanh-he-quan-tri-csdlBai tap-thuc-hanh-he-quan-tri-csdl
Bai tap-thuc-hanh-he-quan-tri-csdlgiang nguyen le
 
Hệ thống quản lý rạp chiếu phim
Hệ thống quản lý          rạp chiếu phimHệ thống quản lý          rạp chiếu phim
Hệ thống quản lý rạp chiếu phimvennguyennoinho
 
Bai giang-ctdl
Bai giang-ctdlBai giang-ctdl
Bai giang-ctdlPhong Vân
 
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGPHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGThùy Linh
 
API Testing & SoapUI
API Testing & SoapUIAPI Testing & SoapUI
API Testing & SoapUITran Bich
 
Mô hình hóa Use Case 01
Mô hình hóa Use Case 01Mô hình hóa Use Case 01
Mô hình hóa Use Case 01vanphong20082002
 

What's hot (20)

Bài giảng asp.net
Bài giảng asp.netBài giảng asp.net
Bài giảng asp.net
 
Cơ sở dữ liệu
Cơ sở dữ liệuCơ sở dữ liệu
Cơ sở dữ liệu
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql
 
Bài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần MềmBài giảng Công Nghệ Phần Mềm
Bài giảng Công Nghệ Phần Mềm
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winformBài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winform
 
Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...
Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...
Đề tài: Nghiên cứu Hệ thống Honeypots và Honeynet nhằm nghiên cứu một số kỹ t...
 
Bai tap testing junit…..
Bai tap testing junit…..Bai tap testing junit…..
Bai tap testing junit…..
 
Báo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTTBáo cáo thực tập Athena - CNTT
Báo cáo thực tập Athena - CNTT
 
Chia subnetmask
Chia subnetmaskChia subnetmask
Chia subnetmask
 
Phân tích thiết kế hệ thống của hàng bán điện thoại di động
Phân tích thiết kế hệ thống của hàng bán điện thoại di độngPhân tích thiết kế hệ thống của hàng bán điện thoại di động
Phân tích thiết kế hệ thống của hàng bán điện thoại di động
 
Tìm hiểu về giao thức mạng tcp ip
Tìm hiểu về giao thức mạng tcp ipTìm hiểu về giao thức mạng tcp ip
Tìm hiểu về giao thức mạng tcp ip
 
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTTSlide Báo Cáo Đồ Án Tốt Nghiệp CNTT
Slide Báo Cáo Đồ Án Tốt Nghiệp CNTT
 
Bai tap-thuc-hanh-he-quan-tri-csdl
Bai tap-thuc-hanh-he-quan-tri-csdlBai tap-thuc-hanh-he-quan-tri-csdl
Bai tap-thuc-hanh-he-quan-tri-csdl
 
Hệ thống quản lý rạp chiếu phim
Hệ thống quản lý          rạp chiếu phimHệ thống quản lý          rạp chiếu phim
Hệ thống quản lý rạp chiếu phim
 
Bai giang-ctdl
Bai giang-ctdlBai giang-ctdl
Bai giang-ctdl
 
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGPHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
 
Tấn Công DDOS
Tấn Công DDOSTấn Công DDOS
Tấn Công DDOS
 
API Testing & SoapUI
API Testing & SoapUIAPI Testing & SoapUI
API Testing & SoapUI
 
Mô hình hóa Use Case 01
Mô hình hóa Use Case 01Mô hình hóa Use Case 01
Mô hình hóa Use Case 01
 

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

Bai 4 lap trình phia client
Bai 4  lap trình phia clientBai 4  lap trình phia client
Bai 4 lap trình phia clientLee Nam Nguyen
 
Bai3 basic servlets_956
Bai3 basic servlets_956Bai3 basic servlets_956
Bai3 basic servlets_956Ham Chơi
 
Jniについて
JniについてJniについて
JniについてChu Chu
 
Core java 2
Core java 2Core java 2
Core java 2. .
 
Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Linh Nguyen
 
Videoconferencereport
VideoconferencereportVideoconferencereport
Videoconferencereporttuanle1984
 
Web Architecture
Web ArchitectureWeb Architecture
Web ArchitectureHiep Luong
 
Lập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnLập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnSon Nguyen
 
Kinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnKinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnDotnet Open Group
 
OOP in Java - Ver1.1
OOP in Java -  Ver1.1OOP in Java -  Ver1.1
OOP in Java - Ver1.1vdlinh08
 

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

Dsd05 03-rmia
Dsd05 03-rmiaDsd05 03-rmia
Dsd05 03-rmia
 
Dsd05 02a-xml-rpca
Dsd05 02a-xml-rpcaDsd05 02a-xml-rpca
Dsd05 02a-xml-rpca
 
Bai 4 lap trình phia client
Bai 4  lap trình phia clientBai 4  lap trình phia client
Bai 4 lap trình phia client
 
Bai3 basic servlets_956
Bai3 basic servlets_956Bai3 basic servlets_956
Bai3 basic servlets_956
 
Jniについて
JniについてJniについて
Jniについて
 
Core java 2
Core java 2Core java 2
Core java 2
 
Dsd05 02b-json-rpca
Dsd05 02b-json-rpcaDsd05 02b-json-rpca
Dsd05 02b-json-rpca
 
Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)Bai tap lap trinh mang(1)
Bai tap lap trinh mang(1)
 
Phan 1 sv
Phan 1   svPhan 1   sv
Phan 1 sv
 
Ch06
Ch06Ch06
Ch06
 
Videoconferencereport
VideoconferencereportVideoconferencereport
Videoconferencereport
 
Dsd05 01-rpca
Dsd05 01-rpcaDsd05 01-rpca
Dsd05 01-rpca
 
Lab lap trinhmang_v3
Lab lap trinhmang_v3Lab lap trinhmang_v3
Lab lap trinhmang_v3
 
Web Architecture
Web ArchitectureWeb Architecture
Web Architecture
 
Lập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biếnLập trình web với các công nghệ phổ biến
Lập trình web với các công nghệ phổ biến
 
Sapo Microservices Architecture
Sapo Microservices ArchitectureSapo Microservices Architecture
Sapo Microservices Architecture
 
Kinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnKinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vn
 
Lt socket
Lt socketLt socket
Lt socket
 
OOP in Java - Ver1.1
OOP in Java -  Ver1.1OOP in Java -  Ver1.1
OOP in Java - Ver1.1
 
Bai44-48.pptx
Bai44-48.pptxBai44-48.pptx
Bai44-48.pptx
 

Recently uploaded

Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoáCác điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoámyvh40253
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfhoangtuansinh1
 
kinh tế chính trị mác lênin chương hai và hàng hoá và sxxhh
kinh tế chính trị mác lênin chương hai và hàng hoá và sxxhhkinh tế chính trị mác lênin chương hai và hàng hoá và sxxhh
kinh tế chính trị mác lênin chương hai và hàng hoá và sxxhhdtlnnm
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...Nguyen Thanh Tu Collection
 
powerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgs
powerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgspowerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgs
powerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgsNmmeomeo
 
Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................TrnHoa46
 
CD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh choCD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh chonamc250
 
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...hoangtuansinh1
 
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảoKiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảohoanhv296
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...Nguyen Thanh Tu Collection
 
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...Nguyen Thanh Tu Collection
 
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdfBỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdfNguyen Thanh Tu Collection
 
cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-
cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-
cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-KhnhHuyn546843
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfTrnHoa46
 
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng ĐồngGiới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng ĐồngYhoccongdong.com
 

Recently uploaded (20)

Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoáCác điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
 
kinh tế chính trị mác lênin chương hai và hàng hoá và sxxhh
kinh tế chính trị mác lênin chương hai và hàng hoá và sxxhhkinh tế chính trị mác lênin chương hai và hàng hoá và sxxhh
kinh tế chính trị mác lênin chương hai và hàng hoá và sxxhh
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI KỸ NĂNG VIẾT ĐOẠN VĂN NGHỊ LUẬN XÃ HỘI 200 C...
 
powerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgs
powerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgspowerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgs
powerpoint mẫu họp phụ huynh cuối kì 2 học sinh lớp 7 bgs
 
Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................
 
CD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh choCD21 Exercise 2.1 KEY.docx tieng anh cho
CD21 Exercise 2.1 KEY.docx tieng anh cho
 
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
 
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảoKiểm tra cuối học kì 1 sinh học 12 đề tham khảo
Kiểm tra cuối học kì 1 sinh học 12 đề tham khảo
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
SÁNG KIẾN ÁP DỤNG CLT (COMMUNICATIVE LANGUAGE TEACHING) VÀO QUÁ TRÌNH DẠY - H...
 
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
ĐỀ CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT CÁC TỈNH THÀNH NĂM HỌC 2020 –...
 
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdfBỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
BỘ LUYỆN NGHE VÀO 10 TIẾNG ANH DẠNG TRẮC NGHIỆM 4 CÂU TRẢ LỜI - CÓ FILE NGHE.pdf
 
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
 
cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-
cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-
cac-cau-noi-tthcm.pdf-cac-cau-noi-tthcm-
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
 
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng ĐồngGiới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
Giới thiệu Dự án Sản Phụ Khoa - Y Học Cộng Đồng
 

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

  • 1. Chapter 9 RMI Remote Method Invocation GV: Nguyễn Thị Thanh Vân
  • 2. 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  Java Simplified / Session 22 / 2 of 2 45
  • 3. Giới thiệu  Lập trình HĐT phân tán: ◦ ◦  Java: giải quyết vấn đề lập trình 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 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 Java Simplified / Session 22 / 3 of 3 45
  • 4. 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. Java Simplified / Session 22 / 4 of 4 45
  • 5. Mô hình triệu gọi các đối tượng từ xa Computer A Computer B A2 B2 A1 B2 B3 Computer C C1 Java Simplified / Session 22 / 5 of 5 45
  • 6. 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 Java Simplified / Session 22 / 6 of 6 45
  • 7. 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). Java Simplified / Session 22 / 7 of 7 45
  • 8. 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. Java Simplified / Session 22 / 8 of 8 45
  • 9. 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 Java Simplified / Session 22 / 9 of 9 45
  • 10. 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 10 Java Simplified / Session 22 / 10 of 45
  • 11. A2 A1 Computer B B1_Skel Computer A B1_Stub Lớp trung gian Stub và Skeletion B1 C1_Skel C1_Stub Computer C C1 11 Java Simplified / Session 22 / 11 of 45
  • 12. 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 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ộ. 12 Java Simplified / Session 22 / 12 of 45
  • 13. 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. Quá trình diễn ra như sau: a,b c 13 Java Simplified / Session 22 / 13 of 45
  • 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 14 some firewall penetration strategies. Java Simplified / Session 22 / 14 of 45
  • 15. Kiến trúc của RMI 15 Java Simplified / Session 22 / 15 of 45
  • 16. Quá trình hoạt động của RMI Remote Machine (Server) RMI Server   bind  Registry Skeleton return     lookup call Stub   RMI Client  Local Machine (Client) 16 Java Simplified / Session 22 / 16 of 45
  • 17. 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) 17 Java Simplified / Session 22 / 17 of 45
  • 18. Trình (bộ quản lý)đăng ký Registry  là một chương trình dịch vụ chạy ở hậu Registry 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 Client cổng mặc định 1099, có thể chỉ định một Server cổng khác với cổng 1099. ◦  Ví dụ: C:j2sdk1.4.0bin 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ụ, 18 Java Simplified / Session 22 / 18 of 45
  • 19. 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 Java Simplified / Session 22 / 19 of 45
  • 20. Các lớp và các giao tiếp trong gói java.rmi 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. 20 Java Simplified / Session 22 / 20 of 45
  • 21. 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ó. 21 Java Simplified / Session 22 / 21 of 45
  • 22. 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ộ 22 Java Simplified / Session 22 / 22 of 45
  • 23. 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. 23 Java Simplified / Session 22 / 23 of 45
  • 24. RemoteObject class RemoteObject  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. UnicastRemote Server Object RemoteServer UnicastRemote Object UnicastRemote Server Remote 24 Java Simplified / Session 22 / 24 of 45
  • 25. 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. 25 Java Simplified / Session 22 / 25 of 45
  • 26. 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. 26 Java Simplified / Session 22 / 26 of 45
  • 27. 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 27 Java Simplified / Session 22 / 27 of 45
  • 28. 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 28 Java Simplified / Session 22 / 28 of 45
  • 29. 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.*; 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 29 Java Simplified / Session 22 / 29 of 45
  • 30. 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 //ko 30 Java Simplified / Session 22 / 30 of 45
  • 31. 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 31 Java Simplified / Session 22 / 31 of 45
  • 32. 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 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 32 Java Simplified / Session 22 / 32 of 45
  • 33. 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 ..Javajdk1.7.0_05bin  Không cần chạy service trên nếu có: LocateRegistry.createRegistry(1099 ); trong main của trình Server 33 Java Simplified / Session 22 / 33 of 45
  • 34. 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. 34 Java Simplified / Session 22 / 34 of 45
  • 35. 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 35 Java Simplified / Session 22 / 35 of 45
  • 36. Test 36 Java Simplified / Session 22 / 36 of 45
  • 37. Review 37 Java Simplified / Session 22 / 37 of 45
  • 38. Lưu ý cách vận hành 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  38 Java Simplified / Session 22 / 38 of 45
  • 39. RMI trên JVM 39 Java Simplified / Session 22 / 39 of 45
  • 40. RMI trên máy thực cài đặt của đối tượng 40 Java Simplified / Session 22 / 40 of 45
  • 41. Tự tạo bộ đăng kí (ko 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: LocateRegistry.createRegistry(1234); Naming.bind("rmi://localhost:1234/myCal",c2); 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…"); 41 Java Simplified / Session 22 / 41 of 45
  • 42. Các lớp được tạo ra trong RMI Các lớp và phạm vi sử dụng Server Client Cal.class Cal.class CalImpl.class CalClient.class CalServer.class CalImpl_Stub.class CalImpl_Stub.class CalImpl_Skel.class 42 Java Simplified / Session 22 / 42 of 45
  • 43. Biến Classpath và tùy chọn Codebase  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 43 Java Simplified / Session 22 / 43 of 45
  • 44. Biến Classpath và tùy chọn Codebase  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 44 Java Simplified / Session 22 / 44 of 45
  • 45. Nạp stub từ xa xuống client thông qua web server 2. RMI registry nhận yêu cầu,trả về tham chiếu đối tượng, nhưng 3. Client yêu cầu rmi registry truy tìm stub trong CLASSPATH 1. Server yêu cầu webserver cung của tự biết địa tìm webserver để 4. Client sử có hướng dẫn chỉ giao cấp server yêu cầu _Stub đăng ký đối đó để dẫn tiếp với nhưngchưa sẽ có, theotượng với rmi registry, nó chỉlớprmiweb từ rmiregistry dụng stub sự máy khách stubserver client không stub, rmi registry cho nó động nạp đến registry 5. truychỉ để lấy stub http://172.16.11.12/myclass/ dẫn đến web server download thông qua web ghi nhớ lại đường địa tìm đối stub về, về nó lên codebase:stub đồng thời server server (IP: 172.16.11.12 45 Java Simplified / Session 22 / 45 of 45
  • 46. 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{ 46 Java Simplified / Session 22 / 46 of 45
  • 47. 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ê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); } } } 47 Java Simplified / Session 22 / 47 of 45
  • 48. 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: ..javajdk1.7.0_05jrelibsecurityjava.polic y 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 }; 48 Java Simplified / Session 22 / 48 of 45
  • 49. 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 49 Java Simplified / Session 22 / 49 of 45
  • 50. Chuyển đối tượng 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 50 Java Simplified / Session 22 / 50 of 45
  • 51. Ex: truyền tham số qua mạng sử dụng giao tiếp Serializable  RMI_Ball 51 Java Simplified / Session 22 / 51 of 45
  • 52. Output 52 Java Simplified / Session 22 / 52 of 45
  • 53. 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.  53 Java Simplified / Session 22 / 53 of 45
  • 54. Thiết kế ct chuyển đổi đối tượng qua mạng theo tham chiếu 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 54 Java Simplified / Session 22 / 54 of 45
  • 55. 1,2. Đặc tả g.tiếp cho đối tượng Client, Server import java.rmi.*; public interface AtClient extends Remote { //pt này được gọi bởi đ.tượng AtServer trên máy chủ public void callClientMethod(String message) throws RemoteException; } public interface AtServer extends Remote { //Tiếp nhận tham chiếu đến đối tượng AtClient trên trình khách public void registerClient(AtClient c) throws RemoteException; //Cung cấp dịch vụ cho các trình khách public void callServerMethod(String message)throws RemoteException; } 55 Java Simplified / Session 22 / 55 of 45
  • 56. 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 chủ 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 của đối tượng chạy trên máy khách client.callClientMethod(msg); } 56 Java Simplified / Session 22 / 56 of 45 }
  • 57. 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 chủ AtServer server=new AtServerImpl(); //thông báo khả năng giao tiếp được từ xa UnicastRemoteObject.exportObject(server); //Đăng ký đối tượng với RMI Naming.bind("rmi://localhost/serverobject",server); System.out.println("Waiting for clientrequest ..."); } } 57 Java Simplified / Session 22 / 57 of 45
  • 58. 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ởi tạo đối tượng khách AtClient client=new AtClientImpl(); //thông báo khả năng giao tiếp được từ xa UnicastRemoteObject.exportObject(client); AtServer server= (AtServer)Naming.lookup("rmi://localhost/serverobject"); //Truyền t.chiếu của AtClient từ trình khách lên chủ //Trình chủ ko cần .lookup để truy tìm tc đến AtClient server.registerClient(client); server.callServerMethod("Client ContactServer"); } } 58 Java Simplified / Session 22 / 58 of 45
  • 59. 7. Tạo lớp trung gian cho cả 2 đối tượng Server và Client. 8. Khởi động rmiregistry 59 Java Simplified / Session 22 / 59 of 45
  • 60. 9. Cài đặt đối tượng trên Server 10. Chạy trình khách trên Client 60 Java Simplified / Session 22 / 60 of 45
  • 61. 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ị?  61 Java Simplified / Session 22 / 61 of 45
  • 62. 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ự) 62 Java Simplified / Session 22 / 62 of 45
  • 63. Serialization 63 Java Simplified / Session 22 / 63 of 45
  • 64. Tuần tự hóa đối tượng 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ự.  64 Java Simplified / Session 22 / 64 of 45
  • 65. Tuần tự hóa đối tượng 65 Java Simplified / Session 22 / 65 of 45
  • 66. 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  66 Java Simplified / Session 22 / 66 of 45
  • 67. 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 class Junk implements objectOut.writeObject(obj2); // Write object Serializable { objectOut.close(); // Close the output stream String str; ObjectInputStream objectIn = null; public Junk(String s) int Count = 0; { str = s; } Junk object = null; public String toSt(){ objectIn = new ObjectInputStream( return str; } new BufferedInputStream(new FileInputStream("b.txt"))); } while (Count < 2) { object = (Junk) objectIn.readObject(); Count++; System.out.println("Object " + Count + ": " + object.toStr()); } objectIn.close(); } } 67 Java Simplified / Session 22 / 67 of 45
  • 68. Đăng ký nhiều đối tượng với RMIRegistry 68 Java Simplified / Session 22 / 68 of 45
  • 69. 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ữ String hostAdd = "127.0.0.1"; //kết nối với bộ RMIRegistry Registry reg = LocateRegistry.getRegistry(hostAdd); //Lấy danh sách các đối tượng về String Objlist[] = reg.list(); 69 Java Simplified / Session 22 / 69 of 45
  • 70. 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á 70 Java Simplified / Session 22 / 70 of 45
  • 71. Mô hình hoạt động của Factory Object 3. Đối tượngthamtạo ra đối trả về tham chiếuvề với tạo 4. Trìnhtượngchủ chiếu vàrmiregistry tênlấy của trình 2. Trình vào Factory Object đăng Factory mìnhvề y/c 1. Đối khách triệu hệ với Factoryký để Object Object 5. Dựa khách liên gọi do tượng Object trả tham ra và cho Bđối tượnggọi đến Objectkhách or Object B A, Object phép tham Factory Object A hoặc Object B chiếu đến theo yêu cầu của trình rmiregistry. hiện lời chiếu đến Object A khách thực 71 Java Simplified / Session 22 / 71 of 45
  • 72. 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 72 Java Simplified / Session 22 / 72 of 45
  • 73. Các bước triển khai 1. 2. 3. 4. Đặ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 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() 73 Java Simplified / Session 22 / 73 of 45
  • 74. Đặc tả g.tiếp cho News, Timer, FactoryService package Factory; public interface News extends Remote{ public String getTodayNews() throws RemoteException; } package Factory; public interface Timer extends Remote{ public Date getCurrentTime() throws RemoteException; } package Factory; public interface FactoryService extends Remote{ public News createNews() throws RemoteException; public Timer createTimer() throws RemoteException; } 74 Java Simplified / Session 22 / 74 of 45
  • 75. 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(); } 75 } Java Simplified / Session 22 / 75 of 45
  • 76. 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; } } 76 Java Simplified / Session 22 / 76 of 45
  • 77. 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()); } } 77 Java Simplified / Session 22 / 77 of 45
  • 78. Output 78 Java Simplified / Session 22 / 78 of 45
  • 79. 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"); 79 Java Simplified / Session 22 / 79 of 45
  • 80. 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() 80 Java Simplified / Session 22 / 80 of 45
  • 81. Đặc tả và cài đặt một Remote Interface // Friend.java import java.rmi.*; public interface Friend extends Remote { public String greeting(String name) throws RemoteException; } // Friend.java public class FriendImp implements Friend{ public String greeting(String name) throws RemoteException; return (“Hi " + name + “ Nice to meet you "); } } 81 Java Simplified / Session 22 / 81 of 45
  • 82. 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); } 82 Java Simplified / Session 22 / 82 of 45
  • 83. 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); } Friend f= (Friend) Naming.lookup ("rmi://localhost/Friend"); } 83 String result = f.greeting(“Quoc Anh”); Java Simplified / Session 22 / 83 of 45
  • 84. RMIRegistry và vấn đề Firewall  Kết nối giữa trình khách và RMIRegistry bị chặn bởi firewall: 84 Java Simplified / Session 22 / 84 of 45
  • 85. 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) 85 Java Simplified / Session 22 / 85 of 45
  • 86. Tunneling 1. Đối tượng Object đăng xuất Object lấy tham chiếu 3. Máy kháchvề kết quả ký với RMIRegistry. giao 4.Web server y/c một đối tượng trungthông qua Servlet liên gọi tới RMIRegistry để hệ Object 2. Servlet triệugửi y/c truytrả Webservercho Servlet 5. Servlet trả Webserver cho kết quả về gian trình khách 6. Cuối cùng 7. trên Object Webserver. của http chủ thức máy đến (server) để xử lý 86 Java Simplified / Session 22 / 86 of 45
  • 87. 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 87 Java Simplified / Session 22 / 87 of 45
  • 88. 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 88 Java Simplified / Session 22 / 88 of 45
  • 89. 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 89 Java Simplified / Session 22 / 89 of 45
  • 90. Giao tiếp giữa trình khách và đối tượng Corba trên Server 90 Java Simplified / Session 22 / 90 of 45
  • 91. 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 91 Java Simplified / Session 22 / 91 of 45
  • 92. 92 Java Simplified / Session 22 / 92 of 45
  • 93. Summary 1. Để xây dựng đối tượng ở xa ta phải: -Thiết -Cài lập một giao tiếp của đối tượng. đặ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 Remote o 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) 93 Java Simplified / Session 22 / 93 of 45