Vấn đề:
Server: càiđặtmộtứngdụnghoànchỉnh
Client:khôngphảicàiđặtgìhếtmàchỉgọiứng
dựngtừServer
Giảipháp:RMIClassLoader
Chophépnạpvềmộtchươngtrình trên Server
theogiaothứchttp.
Chịutráchnhiệmđemvềtất cảcáclớpconhay
lớpthưviệnmàlớpchươngtrìnhcầnđến.
51 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3600 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Tìm hiểu về Java rmi, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
JAVA RMI
GVHD: TS. Hồ Bảo Quốc
Thực hiện:
Nguyễn Phú Thịnh
Lê Xuân Mai
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
MỤC LỤC
1. Giới thiệu tổng quan
2. Các vấn đề và giải pháp
3. Demo
MỤC LỤC
1. Giới thiệu tổng quan
2. Các vấn đề và giải pháp
3. Demo
JAVA RMI LÀ GÌ?
Kĩ thuật lập trình phân tán đối tượng trong
Java.
Mang ý nghĩa triệu gọi đối tượng từ xa.
Cách giao tiếp giữa các đối tượng Java có
mã lệnh cài đặt (bao gồm phương thức và
thuộc tính) nằm trên các máy khác nhau có
thể triệu gọi lẫn nhau.
JAVA RMI LÀ GÌ?
Cơ chế truyền và quản lý biến dữ liệu trên hai
máy khác nhau (mashall and unmashall) ?
Lớp STUB và SKELETON
Đây là 2 lớp trung gian giúp các đối tượng
Java trên hai máy khác nhau giao tiếp với
nhau
Stub: ở phía Client (nơi gọi phương thức
của đối tượng ở xa).
Skeleton: ở phía 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).
Lớp STUB và SKELETON
Lớp trung gian Stub:
Trình biên dịch chuyển lời gọi đối
tượng C1 (server) của đối tượng A1
(client) tới Stub, đóng gói tham số
truyền qua mạng đến server.
Nếu có kết quả từ server trả về thì Stub
sẽ chuyển giao kết quả cho đối tượng
A1.
Lớp STUB và SKELETON
Lớp trung gian Skeleton:
Nhận tham số từ Client và chuyển vào
vùng không gian địa chỉ tương thích với
đối tượng C1, sau đó gọi phương thức
tương ứng.
Nếu có kết quả trả về từ phương thức
của đối tượng C1, Skeleton sẽ đóng gói
và trả ngược về Client
Lớp STUB và SKELETON
A1 gọi phương thức của C1 như thế nào ?
?
Cơ chế RMI gọi phương thức từ xa
Bộ đăng ký RMIregistry
Bộ đăng ký có chức năng như một dịch vụ tìm kiếm
Nơi mà đối tượng trên server đăng ký tên để client truy
tìm từ xa.
Chương trình chạy ở dạng service: mở socket và lắng
nghe các yêu cầu gửi đến cổng 1099. Có thể chỉ định một
số cổng khác với cổng mặc định.
Java cho phép kết nối với bộ đăng kí để lấy danh sách
các đối tượng mà RMIregistry đang quản lý.
// Kết nối với bộ đăng kí
Registry registry = LocateRegistry.getRegistry(hostAddr);
// Lấy về danh sách các đối tượng do rmiregistry nắm giữ
String objectAvailable[] = registry.list();
Bộ đăng ký RMIregistry
Tự tạo bộ đăng ký cục bộ
- Java hỗ trợ tạo bộ đăng ký cho riêng mình khi không cần
dùng tới chương trình rmiregistry.exe.
- Cách đăng ký: Gọi phương thức tĩnh createRegistry() của
lớp LocateRegistry.
- Lưu ý: cách này chỉ dùng cho một đối tượng, nếu có đối
tượng nào đó đã tạo ra bộ đăng ký rồi thì tạo một cổng
khác để đăng ký.
LocateRegistry.createRegistry(1234);
…
Naming.bind(“rmi://localhost:1234/myhello”, hello);
Bộ đăng ký RMIregistry
Cơ chế làm việc của máy ảo Java khi đăng kí và gọi đối
tượng giữa Server và Client
Bộ đăng ký RMIregistry
Cơ chế làm việc của máy ảo Java trên mô hình máy mạng
vật lý thực sự
Biến Classpath và Tùy chọn Codebase
BiếnClasspath
Chương trình Java dựa vào biến môi trường Classpath để
truy tìm các tập tin .class
Trên máy ảo rmiregistry đang chạy nếu biến Classpath
không trỏ đến đường dẫn chứa lớp STUB thì sẽ báo lỗi.
Tùy chọn Codebase
Java cung cấp cách thức tự động nạp lớp trung gian
STUB từ xa thông qua tùy chọn codebase khi đăng ký
đối tượng với rmiregistry trên máy chủ. Với điều kiện
máy chủ phải có chương trình web server.
TUẦN TỰ HÓA (SERIALIZABLE) ĐỐI TƯỢNG
Khả năng ghi toàn bộ đối tượng xuống một tập
tin.
Nếu cần thì khôi phục đối tượng về trạng thái
ban đầu, đưa đối tượng vào bộ nhớ sử dụng đúng
y như tình trạng trước khi đối tượng này được
ghi xuống đĩa.
Trong Java, khai báo đối tượng tuần tự hóa bằng
cách cài đặt interface java.io.Serializable
Là nền tảng và được dùng trong cơ chế hoạt
động truyền dữ liệu kiểu đối tượng trong máy ảo
Java và giữa những máy ảo Java với nhau.
VÍ DỤ VỀ CƠ CHẾ HOẠT ĐỘNG CỦA RMI
VÍ DỤ VỀ CƠ CHẾ HOẠT ĐỘNG CỦA RMI
VÍ DỤ VỀ CƠ CHẾ HOẠT ĐỘNG CỦA RMI
MỤC LỤC
1. Giới thiệu tổng quan
2. Các vấn đề và giải pháp
3. Demo
Cơ chế nạp tự động lớp STUB xuống máy khách
Vấn đề:
Khi viết chương trình từ Client, lập trình viên chỉ
cần đến lớp interface mà Server cung cấp.
Lớp STUB chỉ cần thiết cho cơ chế RMI và không
có ý nghĩa với nhà phát triển ứng dụng
Lập trình viên không cần quan tâm đến lớp STUB ?
Giải pháp:
Cách thức nạp tự động lớp STUB thông qua tùy
chọn CODEBASE khi đăng kí đối tượng với
rmiregistry trên server
Lưu ý: Server phải hỗ trợ thêm dịch vụ web server.
Cơ chế nạp tự động lớp STUB xuống máy khách
Cơ chế nạp tự động lớp STUB xuống máy khách
Nạp tập tin từ xa và Chính sách bảo mật từ phía Client
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áy
Client đều phải thông qua lớp bảo về SecurityManager.
RMISecurityManager sử dụng thiết lập trong file java.policy để
cho phép hoặc cấm các kết nối từ xa.
VD:
Grant {
permission java.security.AllPermission
}
Chạy chương trình:
Java –Djava.rmi.server.codebase =
“” CalculatorServer
Cơ chế nạp tự động lớp STUB xuống máy khách
Chuyển tham số trong các lời gọi phương thức từ xa
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 đối tượng muốn truyền qua
mạng đều buộc phải cài đặt 1 trong 2 giao tiếp:
Remote: Đối tượng sẽ truyền theo tham chiếu.
Serializable : Đối tượng sẽ truyền theo tham trị.
Trong các lời gọi phương thức RMI, kiểu dữ liệu đối
tượng nếu không cài đặt một trong hai giao tiếp thì sẽ
không thể dùng làm tham số chuyển qua mạng được.
Chuyển đối tượng đến server theo tham trị
- Client gọi một phương thức của đối tượng trên
server, nếu trong lời gọi phương thức có yêu cầu
tham số là kiểu đối tượng, đối tượng sẽ được đóng
gói chuyển toàn bộ đến server (lớp _Stub). Tại
server đối tượng sẽ được bung ra lại trạng thái ban
đầu và đưa vào sử dụng (lớp _Skel).
Mashalling data
- Đối tượng phải được cài đặt interface Serializable
Chuyển đối tượng đến server theo tham trị
Chuyển đối tượng đến server theo tham trị
Chuyển đối tượng đến server theo tham trị
Chuyển đối tượng đến server theo tham trị
Chuyển đối tượng đến server theo tham trị
Chuyển đối tượng đến server theo tham trị
Kết quả:
Client Server
Ball weight before send
to server 12
Ball weight after send
to server 12
Ball weight return by
server 27
Waiting fore client
request...
Client send a Ball
object, weight = 12
Chuyển đối tượng đến server theo tham biến
- Vấn đề: nếu đối tượng cần truyền lên server
quá lớn, ảnh hưởng tốc độ thực thi của
chương trình.
Server có thể tham chiếu và xử lý trực tiếp
đối tượng đang ở Client ?
- Giải pháp: Client sẽ chuyển đối tượng cho
Server theo tham chiếu.
Server và Client có thể triệu gọi lẫn nhau
- Đối tượng phải được cài đặt interface
Remote
Chuyển đối tượng đến server theo tham biến
Chuyển đối tượng đến server theo tham biến
Chuyển đối tượng đến server theo tham biến
Chuyển đối tượng đến server theo tham biến
Chuyển đối tượng đến server theo tham biến
Chuyển đối tượng đến server theo tham trị
Kết quả:
Client Server
Server response 82.43
Server response 132.43
Server response 532.77
Server response 54.83
Server response 75.34
Waiting for client
request ...
Client contact Server
Ngẫunhiên
Dùng một đối tượng sản sinh nhiều đối tượng
(Factory Object)
Vấn đề: khi xây dựng đối tượng chủ, chúng ta
phải đặt cho đối tượng một tên, đăng kí tên đối
tượng với rmiregistry.
Nhà phát triển ứng dụng trên Client phải nhớ
hết tên của những đối tượng này.
Giải pháp:
Xây dựng một đối tượng duy nhất và đăng kí
với rmiregistry.
Nhiệm vụ của đối tượng này là tạo ra các đối
tượng con khác.
Factory object
Dùng một đối tượng sản sinh nhiều đối tượng
(Factory Object)
Gọi đối tượng từ xa bằng phương thức động
(Dynamic Method Invoke)
Vấn đề: khi Client muốn gọi phương thức của đối tượng:
(Hello) obj = (Hello)Naming.lookup(“rmi://localhost/myhello”)
obj->sayHello;
Đây là cách gọi hàm tĩnh vì Client chuyển kiểu đối tượng về dạng
tường minh
Nếu bạn không có lớp interface Hello trong tay ?
Giải pháp: Sử dụng kỹ thuật phản chiếu (reflect) của Java
để thực hiện triệu gọi phương thức động.
Lấy tham chiếu của đối tượng bằng hàm Naming.lookup() ở dạng
tổng quát Object
Sử dụng Object và gọi phương thức getMethod() để biết phương
thức mà Object đang nắm giữ.
Invoke(): thực thi phương thức bên trong đối tượng.
Tự động kích hoạt đối tượng từ xa (Activation)
Vấn đề:
Server có bao nhiêu đối tượng được cài đặt, thì phải cấp
phát bộ nhớ cho bấy nhiêu đối tượng đó, để sẵn sàng
phục vụ Client.
Hao tốn tài nguyên vì không phải tất cả đối tượng đều
được sử dụng tại cùng một thời điểm.
Giải pháp:
Cơ chế tự động kích hoạt đối tượng trên server khi client
có yêu cầu sử dụng.
Chỉ cần đăng ký sự hiện diện của đối tượng trên server.
Chương trình rmid.exe: tiếp nhận sự hiện diện của đối
tượng và tự động khởi tạo đối tượng khi Client có yêu
cầu.
Trình mồi nạp ứng dụng từ xa
Vấn đề:
Server: cài đặt một ứng dụng hoàn chỉnh
Client: không phải cài đặt gì hết mà chỉ gọi ứng
dựng từ Server
Giải pháp: RMIClassLoader
Cho phép nạp về một chương trình trên Server
theo giao thức http.
Chịu trách nhiệm đem về tất cả các lớp con hay
lớp thư viện mà lớp chương trình cần đến.
RMIregistry và các vấn đề về Firewall
Vấn đề:
Cơ chế kết nối theo TCP/IP bằng socket bắt
buộc phải hoạt động trên một cổng chỉ định
Mạng Internet luôn bị kiểm soát nghiêm ngặt
bởi Firewall
Chỉ một số cổng thông dụng được phép kết
nối là: 80 (http), 21 (ftp), 23 (telnet), 110
(POP3 mail)
RMIregistry và các vấn đề về Firewall
RMIregistry và các vấn đề về Firewall
Giải pháp:
Cơ chế trung gian thông qua cổng 80 của Web
server, còn gọi là cơ chế “luồn hầm”
(tunneling)
RMIregistry và các vấn đề về Firewall
RMIregistry và các vấn đề về Firewall
Khó khăn: cài đặt phức tạp, tốn chi phí cao
Mô hình Web service và giao thức SOAP
dựa trên XML.
MỤC LỤC
1. Giới thiệu tổng quan
2. Các vấn đề và giải pháp
3. Demo
CHÂN THÀNH CÁM ƠN
Các file đính kèm theo tài liệu này:
- rmi_trong_java_763.pdf