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... Lớp STUB và SKELETONĐây là 2 lớp tru
Trang 1JAVA 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
Trang 2MỤC LỤC
Trang 3MỤC LỤC
Trang 4JAVA 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.
Trang 5JAVA 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) ?
Trang 6Lớ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).
Trang 7Lớ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.
Trang 8Lớ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
Trang 9Lớp STUB và SKELETON
A1 gọi phương thức của C1 như thế nào ?
?
Trang 10Cơ chế RMI gọi phương thức từ xa
Trang 11Bộ đă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 truytìm từ xa
Chương trình chạy ở dạng service: mở socket và lắngnghe 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áchcá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();
Trang 12…
Naming.bind(“rmi://localhost:1234/myhello”, hello);
Trang 13Bộ đăng ký RMIregistry
Cơ chế làm việc của máy ảo Java khi đăng kí và gọi đốitượng giữa Server và Client
Trang 14Bộ đăng ký RMIregistry
Cơ chế làm việc của máy ảo Java trên mô hình máy mạngvật lý thực sự
Trang 15Biến Classpath và Tùy chọn Codebase
Trang 16TUẦ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.
Trang 17VÍ DỤ VỀ CƠ CHẾ HOẠT ĐỘNG CỦA RMI
Trang 20MỤC LỤC
Trang 21Cơ 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.
Trang 22Cơ chế nạp tự động lớp STUB xuống máy khách
Trang 23 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áyClient đề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 =
“http://path/of/folder/contain/_stub” CalculatorServer
Trang 24Cơ chế nạp tự động lớp STUB xuống máy khách
Trang 25Chuyể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 đốitượ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
Trang 26Chuyể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
Trang 27Chuyển đối tượng đến server theo tham trị
Trang 33Chuyể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
Trang 34Chuyển đối tượng đến server theo tham biến
Trang 39Chuyển đối tượng đến server theo tham trị
Trang 40Dù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.
Trang 41Dùng một đối tượng sản sinh nhiều đối tượng (Factory Object)
Trang 42Gọ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.
Trang 43Tự độ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ấpphát bộ nhớ cho bấy nhiêu đối tượng đó, để sẵn sàngphụ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 đốitượng và tự động khởi tạo đối tượng khi Client có yêu cầu.
Trang 44Trì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
Trang 46RMIregistry và các vấn đề về Firewall
Trang 47Giả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)
Trang 48RMIregistry và các vấn đề về Firewall
Trang 49Khó 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.
Trang 50MỤC LỤC
Trang 51CHÂN THÀNH CÁM ƠN