Giới thiệu
RMI là một sự cài đặt cơ chế RPC vào ngôn ngữ lập trình hướng đối tượng Java. Hệ thống RMI được cho phép một đối tượng chạy trên một sản phẩm ảo Java này còn có thể kích hoạt một phương thức của một đối tượng đang chạy bên trên một thiết bị ảo Java khác. Đối tượng gồm phương thức được gọi từ xa gọi là những đối tượng ở xa (Remote Object).
Bạn đang xem: Rmi là gì
Một ứng dụng RMI thường bao gồm 2 phần phân biệt: Môt chương trình Server với một chương trình Client.
Chương trình server tạo một số các Remote Object, tạo những tham chiếu (reference) đến bọn chúng và chờ những chương trình Client kích hoạt những phương thức của những Remote Object này. Chương trình Client lấy một tham chiếu đến một hoặc nhiều Remote Object trên Server và kích hoạt những phương thức từ xa trải qua các tham chiếu.Một chương trình Client bao gồm thể kích hoạt những phương thức ở xa trên một hay nhiều Server. Tức là sự thực thi của chương trình được trải rộng bên trên nhiều thiết bị tính. Đây đó là đặc điểm của những ứng dụng phân tán. Nói bí quyết khác, RMI là cơ chế để xây dựng các ứng dụng phân tán dưới ngôn ngữ Java.
Kiến trúc của chương trình Client-Server theo cơ chế RMI
Kiến trúc một chương trình Client-Server theo cơ chế RMI được tế bào tả như hình dưới đây:

Trong đó:
server là chương trình cung cấp những đối tượng gồm thể được gọi từ xa. Client là chương trình tất cả tham chiếu đến những phương thức của những đối tượng ở xa trên Server. Stub chứa những tham chiếu đến những phương thức ở xa trên Server. Skeleton đón nhận những tham chiếu từ Stub để kích hoạt phương thức tương ứng trên Server. Remote Reference Layer là hệ thống truyền thông của RMI.Con đường kích hoạt một phương thức ở xa được mô tả như hình dưới đây:

Các cơ chế liên quan trong một ứng dụng đối tượng phân tán
Trong một ứng dụng phân tán cần có các cơ chế sau:
Cơ chế định vị đối tượng ở xa (Locate remote objects): Cơ chế này xác định bí quyết thức cơ mà chương trình Client bao gồm thể lấy được tham chiếu (Stub) đến các đối tượng ở xa. Thông thường người ta sử dụng một Dịch vụ danh bạ (Naming Service) lưu giữ những tham khảo đến các đối tượng được cho phép gọi từ xa nhưng Client sau đó tất cả thể tìm kiếm. Cơ chế giao tiếp với những đối tượng ở xa (Communicate with remote objects): chi tiết của cơ chế giao tiếp với những đối tượng ở xa được thiết lập đặt bởi hệ thống RMI. Tải các lớp dạng bytecodes cho những lớp nhưng nó được chuyển tải qua lại giữa máy ảo (Load class bytecodes for objects that are passed around): vì RMI có thể chấp nhận được các chương trình gọi phương thức từ xa trao đổi những đối tượng với những phương thức ở xa dưới dạng các tham số hay giá bán trị trả về của phương thức, đề xuất RMI cần bao gồm cơ chế cần thiết để tải mã Bytecodes của các đối tượng từ thiết bị ảo này sang sản phẩm công nghệ ảo khác.Hình dưới đây tế bào tả một ứng dụng phân tán dưới RMI sử dụng dịch vụ danh bạ để lấy các tham khảo của các đối tượng ở xa. Trong đó:
hệ thống đăng ký kết tên cho đối tượng tất cả thể được gọi từ xa của bản thân với Dịch vụ danh bạ (Registry Server). Client tra cứu đối tượng ở xa trải qua tên đã được đăng ký trên Registry hệ thống (looks up) cùng tiếp đó gọi các phương thức ở xa. Hình minh họa cũng cho thấy biện pháp thức mà lại hệ thống RMI sử dụng một WebServer sẵn gồm để truyền tải mã bytecodes của các lớp qua lại giữa Client với Server.
Cơ chế vận hành của của một ứng dụng Client-Server theo kiểu RMI


Các lớp hỗ trợ chương trình theo kiểu Client-Server vào Java
Java hỗ trợ những lớp cần thiết để download đặt các ứng dụng Client-Server theo kiểu RMI trong những gói: java.rmi. Trong số đó những lớp thường được dùng là:
java.rmi.Naming java.rmi.RMISecurityManager java.rmi.RemoteException; java.rmi.server.RemoteObject java.rmi.server.RemoteServer java.rmi. Server.UnicastRemoteObjectXây dựng một ứng dụng phân tán với RMI
Xây dụng một ứng dụng phân tán bằng cơ chế RMI gồm những bước sau:
Thiết kế và cài đặt đặt các thành phần của ứng dụng. Biên dịch các chương trình nguồn với tạo ra Stub cùng Skeleton. Tạo các lớp bao gồm thể truy xuất từ mạng cần thiết. Khởi tạo ứng dụngThiết kế và thiết lập đặt những thành phần của ứng dụng.
Xem thêm: Các Loại Ung Thư Mau - Bạn Có Thể Mắc Ung Thư Máu Nếu Có Triệu Chứng Này
Đầu tiên bạn phải xác định lớp như thế nào là lớp cục bộ, lớp nào là lớp được gọi từ xa. Nó bao gồm những bước sau:
Định nghĩa những giao diện cho các phương thức ở xa (remote interfaces): Một remote interface mô tả những phương thức nhưng mà nó có thể được kích hoạt từ xa bởi các Client. Đi cùng với việc định nghĩa Remote Interface là việc xác định các lớp cục bộ làm cho tham số hay giá trị trả về của những phương thức được gọi từ xa. Cài đặt các đối tượng từ xa (remote objects): những Remote Object phải cài đặt mang lại một hoặc nhiều Remote Interfaces đã được định nghĩa. Các lớp của Remote Object class download đặt cho những phương thức được gọi từ xa đã được khai báo vào Remote Interface và bao gồm thể định nghĩa và mua đặt đến cả các phương thức được sử dụng cục bộ. Nếu có những lớp làm cho đối số hay giá bán trị trả về cho những phương thức được gọi từ xa thì ta cũng định nghĩa và cài đặt chúng. Cài đặt những chương trình Client: các chương trình Client gồm sử dụng những Remote Object có thể được mua đặt ở bất kỳ thời điểm nào sau thời điểm các Remote Interface đã được định nghĩa.Biên dịch các tập tin nguồn với tạo Stubs với Skeleton
Giai đoạn này gồm 2 bước: Bước thứ nhất là sử dụng chương trình biên dịch javac để biên dịch những tập tin nguồn như những remote interface, những lớp thiết lập đặt cho những remote interface, lớp server, lớp client và các lớp liên quan khác. Kế tiếp ta cần sử dụng trình biện dịch rmic để tạo ra stub với skeleton cho các đối tượng từ xa từ các lớp download đặt cho những remote interface.
Tạo những lớp tất cả thể truy nã xuất từ mạng
Tạo một tập tin chứa tất cả các file có liên quan như những remote interface stub, các lớp hỗ trợ mà chúng cần thiết phải tải về Client và làm cho tập tin này có thể truy tìm cập đến thông qua một website server.
Thực thi ứng dụng
Thực thi ứng dụng bao gồm việc thực thi rmiregistry server, thực thi server, cùng thực thi client.
Tóm lại các công việc phải làm là:
Tạo giao diện (interface) khai báo các phương thức được gọi từ xa của đối tượng. Tạo lớp mua đặt (implement) mang đến giao diện đã được khai báo. Viết chương trình Server. Viết chương trình Client. Dịch những tập tin nguồn theo dạng RMI để tạo ra các lớp tương ứng với stub đến client, skeleton cho server. Khởi động dịch vụ registry. Thực hiện chương trình Server. Thực thi chương trình Client.Ví dụ minh họa
Trong ví dụ này họ định nghĩa một phương thức String sayHello() được gọi từ xa. Mỗi khi phương thức này được kích hoạt nó sẽ trả về chuỗi "Hello World" cho Client gọi nó.
Dưới đây là những bước để xây dựng ứng dụng:
Bước 01: Tạo giao diện (interface) khai báo các phương thức được gọi từ xa của đối tượng.
Cú pháp tổng quát:import java.rmi.Remote;import java.rmi.RemoteException;public interface InterfaceName extends Remote ReturnType remoteMethodOne() throws RemoteException; ReturnType remoteMethodTwo() throws RemoteException; . . .
Định nghĩa remote interface có tên là HelloItf, gồm phương thức được gọi từ xa là String sayHello() như sau:import java.rmi.Remote;import java.rmi.RemoteException;public interface HelloItf extends Remote String sayHello() throws RemoteException;
Lưu chương trình này vào tập tin HelloItf.java
Bước 02: Tạo lớp download đặt (implement) cho giao diện đã được khai báo:
Cú pháp tổng quát:import java.rmi. Server.UnicastRemoteObject;import java.rmi.RemoteException;public class RemoteClass extends UnicastRemoteObject implements InterfaceName public RemoteClass() throws RemoteException super(); ....... // Implement of Method public ReturnType remoteMethodOne() throws RemoteException ....... // Implement of Method public ReturnType remoteMethodTwo() throws RemoteException ....... // Definition of Method
Định nghĩa lớp tải đặt mang tên là Hello thiết lập đặt mang đến remote interface HelloItfimport java.rmi. Server.UnicastRemoteObject;import java.rmi.RemoteException;public class Hello extends UnicastRemoteObject implements HelloItf public Hello() throws RemoteException super(); public String sayHello() return "Hello World !";
Lưu chương trình này vào tập tin Hello.java
Bước 03: Viết chương trình Server:
Cú pháp tổng quát:import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; public class ServerName public static void main(String args<>) if (System.getSecurityManager() == null) // thiết lập đặt cơ chế bảo mật System.setSecurityManager(new RMISecurityManager()); try // Tạo những đối tượng từ xa RemoteClass remoteObject = new RemoteClass(); // Đăng ký tên cho những đối tượng từ xa Naming.rebind(“RegistryName", remoteObject); ... catch (Exception e) System.out.println(”Error: . . .” + e);
Tạo server có tên HelloServer chứa một đối tượng từ xa obj thuộc lớp mua đặt Hello. Đăng ký kết tên đến đối tượng obj là HelloObjectimport java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; public class HelloServer public static void main(String args<>) if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager()); try Hello obj = new Hello(); Naming.rebind("HelloObject", obj); System.out.println("HelloObject is registried"); catch (Exception e) System.out.println("Error: " + e);
Lưu chương trình này vào tập tin HelloServer.java
Bước 04: Viết chương trình Client:
Cú pháp tổng quát:import java.rmi.Naming;import java.rmi.RemoteException;public class Client public static void main(String args<>) String remoteObjectURL = "rmi://NameServer/RegistryName”; Interfacename object = null; try object = (InterfaceName)Naming.lookup(remoteObjectURL); object.remoteMethodOne(); ... catch (Exception e) System.out.println(" Error: ”+ e);
Tạo client mang tên là HelloClient, kiếm tìm đối tượng HelloObject trên rmiregistry chẳng hạn tại địa chỉ 172.18.211.160. Gọi phương thức sayHello() và in kết quả trả về ra màn hình.import java.rmi.Naming;import java.rmi.RemoteException;public class HelloClient public static void main(String args<>) String helloURL = "rmi://172.18.211.160/HelloObject"; HelloItf object = null; try object = (HelloItf)Naming.lookup( helloURL); String message = object.sayHello(); System.out.println(message); catch (Exception e) System.out.println("Client Error :" + e);
Lưu chương trình vào tập tin HelloClient.java
Bước 05: Dịch các tập tin nguồn theo dạng RMI để tạo ra những lớp tương ứng cùng stub mang đến client, skeleton mang lại server:
Cú pháp tổng quát:javac InterfaceName.java RemoteClass.java Server.java Client.java( Tạo ra những lớp InterfaceName.class RemoteClass.class Server.class Client.class)
rmic RemoteClass( Tạo ra những lớp cho Skeleton với Stub: RemoteClass_Skel.class RemoteClass_Stub.class)
Biên dịch các lớp vào Hello:javac Hello.java HelloItf.java HelloServer.java HelloClient.java
rmic Hello.class
Biên dịch những lớp vào Hello

Bước 06: Khởi động dịch vụ rmiregistry
Cú pháp tổng quát:start rmiregistry
Cổng mặc định là 1099.
Khới động dịch vụ rmiregistry bên trên cổng mặc định như sau:
Khới động dịch vụ rmiregistry trên cổng mặc
Khi đó rmiregistry hệ thống sẽ chạy bên trên một cửa sổ mới, giữ nguyên cửa sổ này, ko đóng nó lại.

Bước 07: Thực hiện chương trình Server
Cú pháp tổng quát:java -Djava.security.policy =UrlOfPolicyFile ServerName
Trong đó UrlOfPolicyFile là địa chỉ theo dạng URL của tập tin tế bào tả chế độ về bảo mật mã nguồn của server (policy file). Nó qui định "ai" (chương trình, thiết bị tính, quy trình trên) sẽ có quyền download những tập tin của nó vào đó tất cả stub. Để đơn giản trong phần này ta có thể chấp nhận được tất cả mọi người đều gồm quyền download các tập tin của Server. Khi triển khai những ứng dụng thật sự ta phải bao gồm các cơ chế bảo mật nghiêm ngặt hơn (Tham khảo tài liệu về Security của Java). Tệp tin policy có dạng như sau:
grant // Allow everything for nowpermission java.security.AllPermission;;
Lưu nội dung bên trên vào tập tin mang tên policy.java
Bước 08: Thực thi chương trình Client:
Cú pháp tổng quát mắngjava ClientName
Thực thi HelloClient với địa chỉ của rmiregistry đưa vào vào tham số