Java RMI hỗ trợ gọi phương thức từ xa trên các đối tượng trong các máy ảo khác nhau. Nó tích hợp mô hình đối tượng phân tán vào Java và làm cho sự khác biệt giữa 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. Trong chương này chúng ta sẽ tìm hiểu về quá trình và phương thức hoạt động của mô hình Java RMI, mời các bạn tham khảo.
Trang 1Java RMI
Trang 2Mục đích
Hỗ trợ gọi phương thức từ xa trên các đối tượng
trong các máy ảo khác nhau
Tích hợp mô hình đối tượng phân tán vào Java
Làm cho sự khác biệt giữa 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.
Tạo ra các ứng dụng phân tán có độ tin cậy một
cách dễ dàng
Duy trì sự an toàn kiểu được cung cấp bởi môi
trường thời gian chạy của nền tảng Java
Trang 3Mô hình gọi đối tượng từ xa - RMI
Local Machine (Client)
SampleServer
remoteObject;
int s;
…
s =
remoteObject.sum(1,2);
System.out.println(s);
Remote Machine (Server)
public int sum(int a,int b) {
return a + b;
}
1,2 3
Trang 4Kiến trúc RMI
RMI Server
skeleton
stub
RMI Client
Registry
bind
lookup return call
Local Machine
Remote Machine
Trang 5Java RMI Layers
TCP
Remote Reference Layer
Transport Layer
Java Virtual Machine
Client Object
Remote Reference Layer
Transport Layer
Java Virtual Machine
Stub
Remote Object
Skeleton
Trang 6The Stub and Skeleton
return call
Remote Interface
Trang 7Mô hình các đối tượng phân tán
Remote
RemoteServer
RemoteObject
RemoteException IOException
UnicastRemoteObject
extension implementation Object
Stub
Remote Interface
Server Impl
Trang 8Các bước tạo RMI
1 Định nghĩa giao diện
2 Phát triển đối tượng bằng cách cài đặt giao diện remote
3 Phát triển chương trình client, server.
4 Biên dịch tập tin java.
5 Tạo ra đối tượng stub và skeleton.
6 Khởi động RMI registry.
7 Chạy các đối tượng remote server
8 Chạy client
Trang 9Bước 1 Định nghĩa giao diện
/* SampleServer.java */
import java.rmi.*;
public interface SampleServer extends Remote
{
public int sum(int a,int b) throws
RemoteException;
}
Trang 10Bước 2 Phát triển đối tượng bằng
cách cài đặt giao diện remote
/* SampleServerImpl.java */
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class SampleServerImpl extends UnicastRemoteObject implements SampleServer{
SampleServerImpl() throws RemoteException {
super();
}
public int sum(int a,int b) throws RemoteException {
return a + b;
}
}
Trang 11Bước 3 Phát triển chương trình
client.
import java.rmi.*;
import java.rmi.server.*;
public class SampleClient{
public static void main(String[] args){ // set the security manager for the client
System.setSecurityManager(new RMISecurityManager());
try{ //get the remote object from the registry
System.out.println("Security Manager loaded");
String url = "//localhost/SAMPLE-SERVER";
SampleServer remoteObject = (SampleServer)Naming.lookup(url);
System.out.println("Got remote object");
System.out.println(" 1 + 2 = " + remoteObject.sum(1,2) );
}
catch (RemoteException exc) {
System.out.println("Error in lookup: " + exc.toString()); }
catch (java.net.MalformedURLException exc) {
System.out.println("Malformed URL: " + exc.toString()); }
catch (java.rmi.NotBoundException exc) {
System.out.println("NotBound: " + exc.toString());
} }
Trang 12Bước 3 Phát triển chương trình
server.
/* SampleServerImpl.java */
public static void main(String args[]){
try {
System.setSecurityManager(new RMISecurityManager());
//set the security manager
//create a local instance of the object
SampleServerImpl Server = new SampleServerImpl();
//put the local instance in the registry
Naming.rebind("SAMPLE-SERVER" , Server);
System.out.println("Server waiting ");
}
catch (java.net.MalformedURLException me) {
System.out.println("Malformed URL: " + me.toString()); }
catch (RemoteException re) {
System.out.println("Remote exception: " + re.toString()); }
}