Lập trình RMI

Một phần của tài liệu Thử nghiệm và đánh giá hiệu năng một số phương pháp truy nhập cơ sở dữ liệu WEB (Trang 31)

1.4.1.1. Giới thiệu về RMI

RMI3 là một hệ thống đối tượng phân tán [13]. Ứng dụng RMI cho phép từ một máy client có thể gọi đến một phương thức của một đối tượng chạy trên máy server thông qua mạng, giống như gọi phương thức của một đối tượng đang chạy trên máy ảo Java tại máy client. Giá trị được phương thức của đối tượng trên server trả lại cho client khi được gọi có thể thuộc kiểu dữ liệu bất kỳ.

1.4.1.2. Các bước tạo ứng dụng RMI

1. Tạo giao diện cho đối tượng được gọi từ xa đặt trên server. Trong giao diện này sẽ khai báo các phương thức cho phép các client gọi từ xa.

3 Remote Method Invocation

2. Tạo lớp server từ xa thực hiện giao diện vừa tạo ra. Lớp thực hiện sẽ xây dựng cụ thể phần mã lệnh thực thi chức năng của các phương thức đã khai báo trong giao diện và nó sẽ bổ sung thêm một phương thức khởi tạo để tạo ra các đối tượng từ xa thực thi các phương thức trong giao diện. Trong lớp thực hiện giao diện từ xa được phép bổ sung thêm các phương thức mới nhưng chỉ có những phương thức khai báo trong giao diện mới có hiệu lực gọi từ xa.

3. Biên dịch giao diện và các lớp thực hiện giao diện bằng cách sử dụng trình biên dịch rmic.exe đi kèm với bộ JDK phiên bản 1.3, ta sẽ nhận được các lớp stub và skeleton (với các phiên bản JDK mới hơn khi biên dịch chỉ nhận được lớp stub) tương ứng với lớp thực hiện giao diện. Lớp stub giúp cho phía client có thể giao tiếp được với tầng tham chiếu từ xa, tương tự lớp skeleton giúp cho server có thể giao tiếp được với tầng tham chiếu từ xa. Nói cách khác, nhờ các lớp này mà chương trình phía client và đối tượng từ xa phía server giao tiếp được với nhau.

4. Tạo một lớp client dùng để truy nhập đối tượng từ xa và gọi các phương thức cần thiết trên đối tượng từ xa.

5. Tạo một lớp đăng ký tên duy nhất cho đối tượng từ xa với dịch vụ đăng ký rmiregistry.exe được cung cấp bởi bộ JDK, dịch vụ này là một ứng dụng chạy nền trên server. Thông qua dịch vụ đăng ký tên duy nhất rmiregistry các client có thể định vị được các đối tượng từ xa trên server và gọi các phương thức từ xa của chúng.

Hình 1.8. Mô hình hoạt động chương trình RMI

1.4.1.3. Ví dụ minh họa cài đặt ứng dụng RMI

Để hiểu rõ hơn cách xây dựng ứng dụng RMI, sau đây sẽ cài đặt một ví dụ ứng dụng RMI. Để cho việc thử nghiệm thuận tiện, ban đầu các file .java, .class của cả hai ứng dụng phía server và client nên lưu trữ trong cùng một thư mục, khi chương trình hoàn thiện sẽ tách các file của ứng dụng client và server về các máy tương ứng.

1. Tạo giao diện chứa các phương thức được gọi từ xa

Tạo giao diện sau và lưu trữ trong một file có tên là checkId.java. Biên dịch nó bằng trình javac.exe đi kèm với bộ JDK để nhận được file .class tương ứng. Câu lệnh biên dịch được thực hiện trong chế độ dòng lệnh theo cú pháp sau javac checkId.java

// Khai báo sử dụng các lớp thư viện import java.rmi.Remote;

import java.rmi.RemoteException; // Khai báo giao diện

public interface checkId extends Remote {

public boolean verifyId(String id) throws RemoteException;

2. Tạo lớp thực hiện giao diện

Tạo lớp thực hiện giao diện sau và ghi trong file văn bản có tên là checkIdImpl.java, sau đó biên dịch để nhận được file .class tương ứng. Cú

pháp thực hiện trong chế độ dòng lệnh là javac checkIdImpl.java

// Thực hiện giao diện checkId

import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException;

public class checkIdImpl extends UnicastRemoteObject implements checkId

{

// Khai báo dữ liệu thử nghiệm là chuỗi id String id;

//Phương thức khởi tạo giá trị cho id

public checkIdImpl() throws RemoteException {

id = "Squirrel"; }

public boolean verifyId(String IdToCheck) throws RemoteException

{ (adsbygoogle = window.adsbygoogle || []).push({});

boolean idOk = false;

// So sánh chuỗi IdToCheck gửi từ ứng dụng client với chuỗi id // Lưu trữ kết quả so sánh trong đối tượng từ xa if (IdToCheck.equals(this.id)) idOk = true; return idOk; } }

3. Tạo các lớp trung gian móc nối giữa ứng dụng client và server

Dùng trình biên dịch rmic.exe của Java đi kèm với bộ JDK để dịch lớp checkIdImpl, cú pháp trong chế độ dòng lệnh là rmic checkIdImpl và nhận được các lớp trung gian tương ứng với ứng dụng phía client và server là checkIdImpl_Stub.class và checkIdImpl_Skel.class. Lớp checkIdImpl_Stub.class xử lý giao tiếp từ phía client, nó chuyển tiếp lời gọi phương thức của client tới server và nhận kết quả trả về từ phía server cho

client. Lớp checkIdImpl_Skel.class xử lý giao tiếp phía server, nó nhận lời gọi phương thức từ client và trả giá trị kết quả về cho client

4. Tạo ứng dụng client

Viết mã lệnh cho ứng dụng client sau và ghi lại với file văn bản có tên là checkIdClient.java. Biên dịch nó để nhận được file checkIdClient.class tương ứng.

import java.rmi.Naming; public class checkIdClient {

public static void main(String argv[]) { try { checkId check = (checkId)Naming.lookup("rmi://localhost/i dDataBase"); System.out.println("Result of checking id is " + check.verifyId("Gopher")); } catch (Exception e) {

System.out.println("Error while verifying id.");

e.printStackTrace(); }

} }

5. Tạo lớp đăng ký tên duy nhất cho đối tượng từ xa

Lớp này chứa một đối tượng từ xa được đăng ký tên duy nhất với dịch vụ rmiregistry. Viết đoạn mã lệnh sau và ghi lại thành file văn bản có tên là RegObject.java. Biên dịch nó để nhận được file lớp là RegObject.class

theo cú pháp javac RegObject.java trong chế độ dòng lệnh.

import java.rmi.Naming; public class RegObject

{

public static void main(String argv[]) {

try {

checkIdImpl checkIdObject = new checkIdImpl(); Naming.rebind("idDataBase",checkIdObject); System.out.println("Registered Id Database."); } catch (Exception e) { e.printStackTrace(); } } }

6. Khởi động dịch vụ đăng ký RMI

Đối tượng từ xa muốn đăng ký tên duy nhất với dịch vụ đăng ký RMI thì đầu tiên phải khởi động dịch vụ đăng ký trong chế độ dòng lệnh theo cú pháp sau :

start rmiregistry

Mặc định dịch vụ đăng ký RMI lắng nghe trên cổng 1099. Nếu cần thay đổi số hiệu cổng của dịch vụ, có thể khởi động dịch vụ đăng ký theo cú pháp sau :

start rmiregistry port_number

Ví dụ start rmiregistry 8080. Khi đó dịch vụ đăng ký sẽ lắng nghe

yêu cầu trên cổng 8080. Chú ý rằng dịch vụ đăng ký RMI là một chương trình chạy nền, không có giao diện người dùng đồ họa.

7. Đăng ký tên đối tượng từ xa bằng cách chạy lớp RegObject

Việc này được thực hiện đơn giản như chạy một ứng dụng dạng Application của Java trong chế độ dòng lệnh như sau :

java RegObject (adsbygoogle = window.adsbygoogle || []).push({});

Nếu nhận được thông báo "Registered Id Database" trên màn hình là đăng ký thành công.

8. Chạy lớp client để giao tiếp với đối tượng từ xa đã đăng ký

Ví dụ này ứng dụng client sẽ gửi một chuỗi định danh là "Gopher" đến đối tượng từ xa trên server để kiểm tra xem định danh này có khớp với một định danh được lưu trữ trong thuộc tính của đối tượng từ xa là chuỗi "Squirrel" hay không. Ứng dụng phía client được thực hiện trong chế độ dòng lệnh như sau :

java checkIdClient

Kết quả thông báo nhận được trên màn hình là "Result of checking id is false".

Một phần của tài liệu Thử nghiệm và đánh giá hiệu năng một số phương pháp truy nhập cơ sở dữ liệu WEB (Trang 31)