24/05/2018, 15:40

Trình mồi nạp ứng dụng từ xa

Điều thú vị của hệ thống mạng là cho phép bạn kêt nối giao tiếp và điều khiển từ xa. Một câu hỏi đặt ra là có cách nào viết 1 ứng dụng hoàn chỉnh đăt trên máy chủ sau đó gọi ứng dụng chạy từ máy khách hay không ?Nói chung là phía máy khách của bạn không cần ...

Điều thú vị của hệ thống mạng là cho phép bạn kêt nối giao tiếp và điều khiển từ xa. Một câu hỏi đặt ra là có cách nào viết 1 ứng dụng hoàn chỉnh đăt trên máy chủ sau đó gọi ứng dụng chạy từ máy khách hay không ?Nói chung là phía máy khách của bạn không cần phảI cài đặt gì cả !.

Với cơ chế RMI gọi hàm từ xa mà Java cung cấp , bạn hoàn toàn có thể thực hiện được ý tưởng này .Trong Java bộ nạp lớp RMIClassloader cho phép lập trình viên lạp về 1 lớp chương trình trên máy chủ theo giao thức http . RMIClassloader cũng chịu trách nhiệm đem về tất cả các lóp con hay lớp thư viện mà lóp chương trình cần đến .Điều này tương tự cơ chế làm việc của Applet.Trong trường hợp Applet , trình duyêt browser chính thức là bộ nạp lơp dẽ thấy nhất.Tất cả những lớp thư viện hay lớp con mà Applet dùng đến đều dược đặt trên máy chủ và được trình duyệt tự động download về đầy đủ trước khi gọi Applet thực thi.

Dưới đây là 1 chương trình ví dụ triệu goi j ứng dụng từ xa.ứng dụng của ta được thiết kế theo mô hình phan tán , ứng dụng sẽ goi j phương thức của 1 đối tượng ở xa . Đối tượng này là một từ điển có trách nhiệm dỏ tìm và trả về ý nghĩa của 1 từ do ứng dụng yêu cầu. Toàn bộ ứng dụng được đặt trên web server của 1 máy chủ .Chương trình khách chỉ cần dùng lớp RMIClassloader để triệu gọi ứng dụng từ web server.

Giả sử địa chỉ IP của máy chủ là 172.16.11.12 ( Bạn có thể thay bằng 127.0.0.1 nếu thử nghiệm trên 1 máy đơn ) hoặc địa chỉ IP do người quản tri mạng cấp cho bạn .

Thư mục gốc của webserver mà ta đã xây dựng trước đây là : C ; webserverwebroot Bạn vào thư mục này tạo thêm thư mục con DictApp để chứa chương trình ứng dụng . Đường dẫn đầy đủ là C ; webserverwebroot DictApp.

Đường dẫn URL tương ứng là http://172.16.11.12 / DictApp/ (Hoặc http://172.0.0.1 /DictApp/ nếu bạn thử nghiem trên máy cục bộ )

Dưới đay mà mã nguồn của các lớp cài đặt trên máy chủ :

Ví dụ : Dictionary Java

Import Java.rmi.*;

/*Lớp giao tiếp đặc tả các phương thức của đối tương Dictionary*/

Public interface Dictionnary extends Remote {

Public string FindWord (String KeyWord) throws RemoteException ; }

Ví dụ :DictionaryImplJava

Inport Java.rmi,*;

/*Lóp cài dặt đối tượng Dictionary*/

Public Class DictionaryImpl Impl implements Dictionary {

String woodlist [ ] ; //Danh sách các từ cần tra

String meaning [ ]; // Danh sách chứa ý nghĩa tương ứng của từ

Public DictionaryImpl () { wordlist = new String [ 3 ] ;

Meaning = new String [ 3 ] ;

//Khởi tạo danh sách từ điển

Wordlist [ 0 ] =”one ” ; meaning [ 0 ] = “mot”;

Wordlist [ 1 ] =”two ” ; meaning [ 1 ] = “ hai”;

Wordlist [ 2 ] =”three ” ; meaning [ 2 ] = “ba”;

// ….. Thêm dữ liệu vào danh sách khi bạn xây dựng một từ điển thật sự

}

// Phương thức này được triệu gọi từ xa để tra từ

Public string findword (String Keyword ) throws RemoteException{

For ( int i=0 ; i<wordlist. Length; i++) {

System .out . println (“Lookup word ” + wordlist [ i ] );

If (keyword . equals(woodlist[ i ] ) return meaning[ i ];

}

Return”word not found”;

}

}

Ví dụ : DictionaryServerjava

Inport java.rmi.server.*;

Import java.rmi.* ;

Import java.rmi.registry.* ;

/*Lớp kiến tạo và đăng ký đối tượng Dictionary với rmiregistry */

Public class DictionaryServer Ơ

Public static void main (String args [ ] ) {

Try {

Dictionary d= new DictionaryImpl ();

UnicastRemoteObject.exportObject( d );

//Thay địa chỉ IP của máy chủ bằng địa chỉ IP của máy bạn nêu có

Naming.bind(“172.16.11.12/mydictionary”,d);

System .out.println ( “ Registered Dictionary”);

// Nếu bạn chạy trên máy đơn cục bộ thì có thể dùng lệnh Naming.blind(“//127.0.0.1/ mydictionary”,d);

} catch (Exception e ) {

System . out . println(e) ;

}

}

}

Ví dụ : DictionaryClient.java

Import java.rmi.*;

/*Lớp chương trình gọi và sử dụng đối tượng Dictionary* /

Public class DictionaryClient implements Runnable { Public static void main (String Args [ ] ) throws Exception {

System .setSecurityManager( new RMISecurityManager());

// Truy tìm đối tượng từ rmiregistry

Dictionary dict = ( Dictionary ) Naming .lookup( “rmi://172.16.11.12 / my dictionary”) ;

//Triệu gọi phương thức của đối tượng

System.out .println ( dict .findword(“three ”));

}

// Phương thức này sẽ giúp cho các máy ở xa có thể nạp chương trình về chạy

Public void Run () {

Main ( null );

}

Biên dịch 4 tâp tin này bạn sẽ thu được 4 lóp tương ứng

Dictionary,Class

DictionaryImpl,Class

DictionaryServer,Class

DictionaryClient,Class

Sử dụng trình biên dịch rmic để tạo ra 2 lớp trung gian _ Stub và _Skel cho đối tương Dictionary như sau :

Rmic DictionaryImpl

Bạn sẽ thu thêm được 2 lớp :

DictionaryImpl_Stub,Class

DictionaryImpl_Skel,Class

Bạn thực hiện theo các bước thứ tự sau :

Bước 1: Đặt tất cả 6 lớp này vào thư mục:

C: webserver webroot DictApp

Với C:webserver webroot đượ coi là đường dẫn bắt đầu (webroot) của webserver.Khởi động webserver mà ta đã tạo ở chương 1 từ dong lệnh :

Java Javawebserver

Bước 2: Khởi động rmiregistry cách từ dòng lệnh :

rmiregistry.exe

Bước3 : Khởi đông chương trình đăng kí đối tượng Dictionary:

DictApp> Java

- Djava.rmi.server.codebase = “http://127.0.0.1 /DictApp / Dictionary

Server

Quá trình chuẩn bị phía máy chủ đã hoàn tất . Bạn có thể gọi chương trình DictionaryClient.

DictApp>java DictionaryClient

Để kiểm tra kết quả xuất . Tuy nhiên DictionaryClient không nhằm chạy trên máy chủ. Nó có thể được triệu gọi từ máy khách ở xa . Có 1 điểm bạn cần lưu ý đó là DictionaryClient cài đặt giao tiếp Runnable.Vâng, chính giao tiếp này sẽ cho phép bạn gọi được phương thức Run() nhằm khởi động chương trình từ máy khách ở xa . Cách thức triệu gọi DictionaryClient ở máy khách sẽ nhờ vào bộ nạp RMIClassloader được đề cập ngay sau đây.

Trên máy khách bạn không cần bất kỳ lóp hỗ trợ nào cả. Điều bạn cần biết là địa chỉ URL trỏ đến nơI lớp ứng dụng DictionaryClient đang nằm trên máy chủ webserver. Lưu mà nguồn của ví dụ 2-46 dưoi đây vào thư mục bất kỳ.

Ví dụ : BootApp.java

Import java.rmi.* ;

Import java.rmi.server.* ;

Public Class BootApp {

Public static void main (String Args [ ] ) throws Exception {

// Thiết lập lớp phòng vệ cho phía máy khách

System . setsecurityManager (new RMISecurityManager ());

//Nạp lớp ứng dụng DictionaryClient từ máy chủ

Class ClientClass = RMIClassloader.loadClass(“http://172.16.11.12 / DictApp/ “,”DictionaryClient”);

//Khởi tạo thể hiện của ứng dụng thông qua giao tiếp Runnable

Runnable c = (Runnable) ClientClass.newInstance();

//Chạy ứng dụng ngay trên máy khách

c.run();

}

Biên dịch chương trình :

C: Testing >Javac bootApp.Java

Triệu gọi ứng dụng :

C: Testing>Java bootApp

Thông thường bootApp dùng cho mục đích chung là khởi động ứng dụng tù xa .Java gọi cơ chế này là cơ chế mồi (BootStrap)

Chương trình mồi có thể được viết tổng quát hơn như sau :

Ví dụ :BootStrapApp.java

Import java.rmi.*;

Import java.rmi.server.* ;

Public Class BootStrapApp {

Puclic Static void main (String Args [ ]) throws Exxeption {

IF ( Args. Length!=2 ) {

System.out.println(“Syntax”);

System.out.println(“Java BootStrapApp < URL> < AppClassName>”);

Return ;

}

// Thiết lập lớp phòng vệ cho phía máy khách

System.SetsecurityManager( new RIMSecurityManager());

// Nạp lớp ứng dụng từ máy chủ Dictionary

Class ClientClass = RMIClassloader.loadClass ( Args [ 0 ] ,args [ 1]);

// Khởi tạo thề hiện ứng dụng thông qua giao tiếp Runnable

Runnable c = (Runnable) ClientClass.newInstance();

//Chạy ứng dụng ngay trên máy khách

c.run();

}

Bạn lên sử dụng BootStrapApp để gọi DictionaryClient từ xa như sau:

C: testing> java BootStrapApp http:// 127.0.0.1 /DictApp / DictionaryClient

BootStrapApp cần 2 tham số dòng lệnh . Tham số thứ nhất là địa chỉ URL viêt hoa nơi lớp ứng dụng có thể được nạp về bằng giao thức http .Tham số thứ 2 là tên lớp ứng dụng chỉ có 1 yêu cầu duy nhất là lớp ứng dụng đặt trên máy chủ phảI cài đặt interface Runnable để BootStrapApp có thể chuyển kiều và gọi phương thức Run() của giao tiếp này khởi động đối tượng . Tổng quát hơn bạn có thể đặt mọi ứng dụng trên webserver của máy chủ , chương trình mồi BootStrapApp sẽ được gọi theo cú pháp sau :

Java BootStrapApp < đường dãn URL > < Tên lớp ứng dụng >

Đọc đến đây có thể bạn có thể hỏi mọi thứ với Java sao “Nhiêu khê ” lắm thế ?

Thật ra , cho đến hôm nay rất ít khi bạn phai xây dựng 1 ứng dụng lớn sử dụng ký thuật RMI như chúng tôi vừa trình bày . Java đã hoàn thiện và đưa ra mô hình J2EE hiệu quả và dễ dàng hơn bao trùm tất cả những khái niemj mà RMI cung cấp. Tuy nhiên , J2EE chính xác cũng dựa trên RMI cho nên thiết nghĩ một khi năm vững về ký thuật xử lý và lập trình đối tượng với RMI bạn sẽ tự tin hơn khi tiếp xúc với môi trường J2EE sẽ được chúng ta nghiên cưu trong phần cuối chương.

0