RSS

RMI

01 Dec

Socket là một trong một phương pháp phổ biến để chúng ta truyền tham số đến một máy khác và nhờ nó xử lý giúp mình một số công việc. Tham số trên đường truyền thường là dạng chuổi (String). Nhưng đó là xưa rồi, RMI đã làm thay đổi mạnh phương pháp cổ xưa thành phương pháp truyền đối tượng, và việc định hướng sẽ được xác định bởi một dịch vụ gọi là RMIRegistry, một bước đệm để phát triển điện toán phân tán (Cloud Computing). Tuy rất rộng nhưng mong rằng vài chia sẻ này sẽ có ích cho các bạn.

Nội dung chính:

  • RMI là gì?
  • Hướng dẫn code
  • Cài đặt RMI trên máy server và Client

RMIRemote Method Invocation ( Yêu cầu phương thức từ xa)

Nó là một phần chính của bộ JDK 1.1 và 2 platform. Qua phương thức này ta có thể gọi một phương thức chỉ được khai báo mà chưa được định nghĩa trên máy mình. Việc định nghĩa này sẽ được thực hiện trên một máy xác định khác; việc xác định máy này sẽ được quản lý bởi một dịch vụ là RMIregistry. Có 2 đối tượng ta cần quan tâm:

Remote Interface: Có nhiệm vụ khai báo các phương thức cần thiết. Lớp phải kế thừa từ lớp java.rmi.Remote và các phương thức phải định nghĩa trả lổi “RemoteException

Remote Object : sẽ kế thừa từ lớp Remote Interface và định nghĩa các phương thức được nêu từ interface đó.

RMIregistry sẽ là nơi để máy ảo java đăng ký nơi chứa Remote Object, việc thực hiện ở các máy ảo java có chứa lớp Remote Interface sẽ hoạt động như bình thường nhưng nguồn tài nguyên sẽ của lớp đó sẽ được lấy từ máy ảo định nghĩa lớp đó.

 

Hướng dẫn code:

Code Remote Interface : If_Database.java

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface If_Database extends  Remote{

    public String getPassword(String pass)throws RemoteException ;

    public String getPermistion(String username) throws RemoteException;

}

Yêu cầu:

  1. Class này phải là interface và được kế thừa từ lớp Remote
  2. Các phương thức phải được trả lổi RemoteException
  3. Chỉ khai báo các phương thức này mà không được định nghĩa nó

Code Remote Object: Cl_Database.java

import java.rmi.RemoteException;

/**

    author = Guide by hotdream1990

*/

 

public class Cl_Database implements If_Database {

 

    public String getPassword(String pass) throws RemoteException {

        // các lệnh sẽ được thực hiện trên tài nguyên của máy chứa nó

       return "Giá trị trả về";

    }

 

    public String getPermistion(String username) throws RemoteException {

        // Các lệnh sẽ được thực hiện trên tài nguyên của máy chứa nó 

        return "Giá trị trả về";

    }

}

Yêu cầu:

  1. Lớp này sẽ kế thừa từ lớp Remote Interface
  2. Các phương thức định nghĩa phải được khai báo trong lớp Remote Interface(không thừa không thiếu) và phải trả lỗi RemoteException

Cài đặt RMI trên máy server và client:

Trên Server:

Trong hàm chính của server : Main.java

import java.rmi.Naming;

import java.rmi.Remote;

import java.rmi.server.UnicastRemoteObject;

/**

    author = guide by hotdream1990

*/

 

public class Main {

    public static void main(String args[]) {

         try{

 

          Cl_Database c=new Cl_Database();

          System.out.println("Dang ket noi den RMIRegistry");

 

          UnicastRemoteObject.exportObject(c);

          Naming.bind("rmi://localhost/database",  c);

          System.out.println("Server dang san sang hoat dong");

 

       }catch (Exception e){

       }

 

    }

 

}

Bạn có những gì trên project Server:

  • Main.java  // Thân chương trình
  • Cl_Database.java  // Remote Object
  • If_Database.java  // Remote Interface

Mở command line của windows tại thư mục chứa chúng sau đó gỏ lệnh biên dịch Remote Object và các file khác thành class:

javac *.java

Biên dịch class này thày stub bằng rmic:

rmic Cl_Database

Sau khi thực hiện lệnh này xong. Chúng ta có thêm một file mới có tên: Cl_Database_Stub.class . Bạn đưa file này sang thư mục chứa các file của client.

Khởi động RMIregistry bằng lệnh trên command line:

start rmiregistry

Sẽ hiện ra một cửa sổ đen sì nhưng đừng tắt vì đây là service của rmiregistry

Sau đó khởi động server: Server sẽ đăng ký với rmiregistry các class được public

java Main

Vậy server đã lắng nghe các kết nối để đáp ứng yêu cầu gọi phương thức từ xa

Trên Client:

Bạn có những gì trên project client:

  • If_Database.java  // Remote Interface
  • Cl_Database_Stub.class // Khung cho RMI của interface, được lấy từ server
  • Main.java

Trong hàm chạy của client: Bất cứ đâu ta cũng có thể sử dụng Remote object bằng cách

...

    try{

        RMIHost = "192.168.1.1"; // ip của server

        If_Database d = (If_Database) Naming.lookup("rmi://" + RMIHost() + "/database");

        d.getPassword("chuoi");

    }catch(Exception e){

    

    }

...

Trên thư mục chứa code của client : biên dịch các file java

javac *.java

Và chạy nó một cách bình thường

java Main

Trên đây vẫn biết còn nhiều lỗi xãy ra vì cấu hình trên máy các bạn không giống mình. Mình sẽ cố gắng bổ sung một số cách khắc phục lỗi. Chúc bạn thành công!!!

write by : hotdream1990

 
1 Comment

Posted by on December 1, 2010 in Java, RMI, zZ_IT_Define_Zz

 

Tags: ,

One response to “RMI

  1. commitflame

    December 2, 2010 at 2:59 am

    Chú ý: Trong Naming.lookup(“rmi://” + RMIHost() + “/database”) có thể thay đổi tùy theo khi server chạy thì phương thức đó được gán theo tên gì. Trong bài này thì nó là /database

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s