21
Tng quan v ng dng RMI  ng dng RMI thng bao gm hai chng trình riêng bit, mt máy ch và máy khách. Mt chng trình máy ch inhình to ra mt s i tng t xa, làm cho tài liu tham khon các i tng có th truy cp, và ch i cho khách hàng gi các phng pháp trên các i tng này. Mtchng trình khách hàng in hình có c mt tham chiut xa n mt hoc nhiu i tng t xa trên mt máy chvà sau ó gi phng pháp trên chúng. RMI cung cp c chmà theo ó các máy ch và khách hàng giao tip và truynthông tin qua li. Mt ng dng nh vy ôi khi c gi làmt ng dng i tng phân phi. ng dng i tng phát hành không cn phi làm nh sau: Xác nh v trí i tng t xa. Các ng dng có th s dng các c ch khác nhau c tài liu tham kho cho các i tng t xa. Ví d, mt ng dng có th ng ký cáci tng t xa ca nó vi c s t tên n gin ca RMI, c quan ng ký RMI. Ngoài ra, mt ng dng có th vt qua và tr v tham chiu i tng t xa nh là mt phnca li gi t xa khác. Giao tip vi các i tng t xa. Thông tin chi tit ca thông tin liên lc gia các i tng t xa c x lý bi RMI. lp trình, truyn thông t xa trông ging nh li giphng pháp thng xuyên Java. Ti các nh ngha lp cho các i tng c thông qua xung quanh. Vì RMI cho phépcác i tng c thông qua tr li và ra, nó cung cp c ch ti các nh ngha lpca mt i tng cng nh truyn d liu ca mt i tng. Hình minh ha sau ây mô t mt ng dng RMI phân phi s dng ng ký RMI c mt tham chiu n mt i tng t xa. Các máy ch cuc gi ng ký liên kt (hoc ràng buc) mt tên vi mt i tng t xa. Khách hàng nhìn lên i tng iu khin t xa bng tên ca nó trong registry ca máy ch và sau ó gi mt phng thc trên nó. Minh ha này cng cho thy rng h thng RMI s dng mt máy ch web hin có ti các nh ngha lp, t máy ch cho khách hàng và khách hàng máy ch, cho các i tng khi cn thit.  u im Loading Mã ng Mt trong nhng tính nng trung tâm và duy nht ca RMI là kh nng ti v các nh ngha ca lp ca mt i tng nu lp hc không c nh ngha trong máy o Java ca ngi nhn. Tt c các loi và hành vi ca mt i tng, trc ây ch có trong mt máy o Java, có th c truyn qua ng khác, có th t xa, máy o Java. RMI qua các i tng ca các lp hc thc t ca h, do ó, hành vi ca các i tng là không thay i khi chúng c gi n mt máy o Java. Kh nng này cho phép các loi mi và hành vi s c gii thiu vào mt máy t xa o Java, do ó t ng m rng các hành vi ca mt ng dng. Ví d công c tính toán trong ng mòn này s dng kh nng này gii thiu hành vi mi cho mt chng trình phân phi. Giao din t xa, các i tng, và phng pháp

ĐỀ TÀI RMI FOR JAVA

Embed Size (px)

Citation preview

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 1/21

T ng quan v ng d ng RMI

ng d ng RMI th ng bao g m hai ch ng trình riêng bi t, m t máy ch và máy khách. M t ch ngtrình máy ch i nhình t o ra m t s i t ng t xa, làm cho tài li u tham kh o n các it ng có th truy c p, và ch i cho khách hàng g i các ph ng pháp trên các i t ngnày. M tch ng trình khách hàng i n hình có c m t tham chi ut xa n m t ho c nhi u it ng t xa trên m t máy ch và sau ó g i ph ng pháp trên chúng. RMI cung c p c ch mà theo ócác máy ch và khách hàng giao ti p và truy nthông tin qua l i. M t ng d ng nh v y ôi khi cg i làm t ng d ng i t ng phân ph i.

ng d ng i t ng phát hành không c n ph i làm nh sau:

Xác nh v trí i t ng t xa. Các ng d ng có th s d ng các c ch khác nhau có c tài li utham kh o cho các i t ng t xa. Ví d , m t ng d ng có th ng ký các i t ng t xa c anó v i c s t tên n gi n c a RMI, c quan ng ký RMI. Ngoài ra, m t ng d ng có th v tqua và tr v tham chi u i t ng t xa nh là m t ph nc a l i g i t xa khác.Giao ti p v i các i t ng t xa. Thông tin chi ti t c a thông tin liên l c gi a các i t ng t xa cx lý b i RMI. l p trình, truy n thông t xa trông gi ng nh l i g iph ng pháp th ng xuyên Java.T i các nh ngh a l p cho các i t ng c thông qua xung quanh. Vì RMI chophépcác i t ng c thông qua tr l i và ra, nó cung c p c ch t i các nh ngh a l pc a m t

i t ng c ng nh truy n d li u c a m t i t ng.Hình minh h a sau ây mô t m t ng d ng RMI phân ph i s d ng ng ký RMI có c m t thamchi u n m t i t ng t xa. Các máy ch cu c g i ng ký liên k t (ho c ràng bu c) m t tên v im t i t ng t xa. Khách hàng nhìn lên i t ng i u khi n t xa b ng tên c a nó trong registry c amáy ch và sau ó g i m t ph ng th c trên nó. Minh h a này c ng cho th y r ng hth ng RMI s d ng m t máy ch web hi n có t i các nh ngh a l p, t máy ch cho kháchhàng và khách hàng máy ch , cho các i t ng khi c n thi t.

u i m Loading Mã ng

M t trong nh ng tính n ng trung tâm và duy nh t c a RMI là kh n ng t i v các nh ngh a c a l p c am t i t ng n u l p h c không c nh ngh a trong máy o Java c a ng i nh n. T t c các lo i vàhành vi c a m t i t ng, tr c ây ch có trong m t máy o Java, có th c truy n qua ng khác,có th t xa, máy o Java. RMI qua các i t ng c a các l p h c th c t c a h , do ó, hành vi c acác i t ng là không thay i khi chúng c g i n m t máy o Java. Kh n ng này cho phép cáclo i m i và hành vi s c gi i thi u vào m t máy t xa o Java, do ó t ng m r ng các hành vic a m t ng d ng. Ví d công c tính toán trong ng mòn này s d ng kh n ng này gi i thi uhành vi m i cho m t ch ng trình phân ph i.

Giao di n t xa, các i t ng, và ph ng pháp

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 2/21

Gi ng nh b t k ng d ng Java khác, m t ng d ng phân tán c xây d ng b ng cách s d ng JavaRMI c th c hi n các giao di n và các l p h c. Các giao di n khai báo các ph ng pháp. Các l p h cth c hi n các ph ng pháp kê khai trong các giao di n và, có l , tuyên b ph ng pháp b sung làt t. Trong m t ng d ng phân tán, m t s hi n th c có th c trú trong m t s máy o Java nh ngkhông ph i nh ng ng i khác. i t ng v i ph ng pháp có th c vi n d n trên máy o Java cg i là i t ng t xa.

M t i t ng s tr thành i u khi n t xa b ng th c hi n m t giao di n t xa, trong ó có các ci m sau ây:

M t giao di n t xa m r ng java.rmi.Remote giao di n.M i ph ng pháp c a giao di n tuyên b java.rmi.RemoteException t i kho n ném c a nó, ngoài cho b tk tr ng h p ngo i l ng d ng c th .RMI x lý m t i t ng t xa khác nhau t m t i t ng không t xa khi i t ng c thông qua tm t máy o Java cho m t máy o Java. Thay vì làm m t b n sao c a i t ng th c hi n nh n cmáy o Java, RMI qua m t bài t xa cho m t i t ng t xa. Còn s khai các hành vi nh là i di n

a ph ng, ho c proxy, cho i t ng t xa và v c b n là, các khách hàng, các tài li u tham kh o t

xa. Khách hàng g i m t ph ng pháp trên cu ng a ph ng, ch u trách nhi m th c hi n vi c g iph ng th c trên i t ng t xa.

M t stub cho m t i t ng t xa th c hi n cùng m t b giao di n t xa mà các i t ng t xa th chi n. Tài s n này cho phép m t stub c úc vào b t k các giao di n mà các i t ng t xa th chi n. Tuy nhiên, ch nh ng ph ng th c c nh ngh a trong m t giao di n t xa có th c g i tnh n c máy o Java.

T o ng d ng phân tán b ng cách s d ng RMI

S d ng RMI phát tri n m t ng d ng phân tán bao g m các b c chung:

Thi t k và th c hi n các thành ph n c a ng d ng phân tán c a b n.Biên so n các ngu n.Các l p m ng có th truy c p.B t u ng d ng.Thi t k và th c hi n các thành ph n ng d ng

u tiên, xác nh ki n trúc ng d ng c a b n, bao g m các thành ph n là các i t ng aph ng và các thành ph n c truy c p t xa. B c này bao g m:

Xác nh các giao di n t xa. M t giao di n t xa quy nh c th các ph ng pháp có th c g i txa b i m t khách hàng. Khách hàng ch ng trình giao di n t xa, không các l p th c hi n các giaodi n. Thi t k c a giao di n nh v y bao g m vi c xác nhcác lo i c a các i t ng s c sd ng nh các thông s và giá tr tr l i cho nh ng ph ng pháp này. N u b t k các giao di n này ho ccác l p h c không t n t i, b n c n ph i xác nh h là t t.Th c hi n các i t ng t xa. i t ng t xa ph i th c hi n m t ho c nhi u giao di nt xa. Các l p

i t ng t xa có th bao g m vi c tri n khai các giao di n và các ph ng pháp khác mà có s n ch t ia ph ng. N u b t k l p h c a ph ng c s d ng cho các tham s ho c giá tr tr l i c a b t

k các ph ng pháp này, h ph i c th c hi n là t t.Th c hi n các khách hàng. Khách hàng s d ng i t ng t xa có th c th c hi nt i b t k th i

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 3/21

gian sau khi các giao di n t xa c xác nh, bao g m c sau khi các i t ng t xa ã c tri nkhai.

Biên so n Ngu n

Nh v i b t k ch ng trình Java, b n s d ng trình biên d ch javac biên d ch t p tinngu n. Các t ptin ngu n ch a các t khai c a các giao di n t xa, tri n khai c a h , các l p h c b t k máy chnào khác, và các l p khách hàng.

L u ý:V i các phiên b n tr c khi Java Platform, Standard Edition 5.0, m t b c b sung làc n thi t

xây d ng các l p h c còn s khai, b ng cách s d ng trình biên d ch rmic.Tuy nhiên, b cnày không còn c n thi t.

Các l p m ng có th truy c p

Trong b c này, b n th c hi n các nh ngh a l p m t s m ng có th truy c p, ch ng h nnh các nhngh a các giao di n t xa và các lo i liên quan c a h , và các nh ngh a cho các l p h c c n ph i ct i v cho khách hàng ho c các máy ch . Các l p h c nh ngh a th ng c làm m ng truy c p thôngqua m t máy ch web.

B t u t các ng d ng

B t u t các ng d ng bao g m c quan ng ký RMI i t ng t xa, máy ch , và khách hàng.

Xây d ng m t Công c Tính chung

ng mòn này t p trung vào m t ng d ng n gi n nh ng m nh m phân ph i, c g i là m t côngc tính toán. Các công c tính toán là m t i t ng t xa trên máy ch cónhi m v t khách hàng, i u

hành nhi m v , và tr v b t k k t qu . Các nhi m v cch y trên các máy mà máy ch angch y. ây là lo i hình ng d ng phân tán có th chophép m t s máy móc c a khách hàng làmcho s d ng m t máy c bi t m nh m hay m t máy tính có ph n c ng chuyên d ng.

Các khía c nh m i l c a ng c tính toán r ng các nhi m v nó ch y không c n ph i c xácnh khi các công c tính toán b ng v n b n ho c b t u. Các lo i nhi m v m i có th c t o ra b t

c lúc nào và sau ó cho các công c tính toán ch y. Yêu c u duy nh t m t nhi m v là l p h c c amình th c hi n m t giao di n c th . Các mã c n thi t hoàn thành nhi m v có th c t i v hth ng RMI các công c tính toán. Sau ó, các công c tính toán i u hành nhi m v , s d ng cácngu n tài nguyên trên máy tính mà trên ó các công c tính toán là ch y.

Kh n ng th c hi n các nhi m v tùy ý c kích ho t b i các tính ch t n ng ng c a n nt ng Java, mà là m r ng m ng b ng cách RMI. RMI t ng t i mã nhi m v vàomáy o Java c a các công c tính toán và i u hành công vi c không có ki n th c s n cóc a l p màth c hi n nhi m v . Nh m t ng d ng, trong ó có các kh n ng t i v mãt ng, th ng c g ilà m t ng d ng d a trên hành vi. Các ng d ng nh v y th ng òi h i c s h t ng y chophép i lý. V i RMI, các ng d ng nh là m t ph n c a c ch c b n cho máy tính phân ph i trên n nt ng Java.

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 4/21

Vi t m t máy ch RMI

Các máy ch công c tính toán ch p nh n nhi m v t khách hàng, i u hành nhi m v , và tr v b tk k t qu . Mã máy ch bao g m m t giao di n và m t l p h c. Giao di n này nh ngh a các ph ngpháp có th c g i t khách hàng. V c b n, giao di n xác nh quan i m c a khách hàng c a it ng t xa. L p này cung c p th c hi n.

Thi t k m t giao di n t xa

Ph n này gi i thích giao di n Tính toán, cung c p k t n i gi a máy khách và máy ch . B n c ng s tìmhi u v API RMI, h tr thông tin liên l c này.

Th c hi n m t giao di n t xa

Ph n này khám phá các l p th c hi n các giao di n Tính toán, qua ó th c hi n m t it ng t xa. L p này c ng cung c p ph n còn l i c a các mã mà làm cho ch ng trình máych , bao g m c m t ph ng pháp chính mà t o ra m t th hi n c a các i t ng t xa, ng ký v i c

quan ng ký RMI, và thi t l p m t nhà qu n lý b o m t.Thi t k m t giao di n t xa

T i c t lõi c a ng c tính toán là m t giao th c cho phép nhi m v c n p cho các công c tínhtoán, các công c tính toán ch y các nhi m v , và các k t qu c a nh ngnhi m v c tr l i chokhách hàng. Giao th c này c th hi n trong giao di n c h tr b i các công c tính toán. Cácthông tin liên l c t xa cho các giao th c này c minh h a trong hình sau ây.

M i giao di n có ch a m t ph ng pháp duy nh t. Giao di n t xa Các công c tính toán,Tínhtoán, cho phép nhi m v c n p cho ng c . Giao di n khách hàng, công tác, xác nh làm th nàocác công c tính toán th c hi n m t nhi m v trình.

Giao di n compute.Compute nh ngh a m t ph n truy c p t xa, b n thân các công c tínhtoán. D i ây là mã ngu n cho giao di n Tính:

package compute;

import java.rmi.Remote;import java.rmi.RemoteException;

public interface Compute extends Remote {<T> T executeTask(Task<T> t) throws RemoteException;}

B ng cách m r ng các java.rmi.Remote giao di n, giao di n Tính toán xác nh chính nó nh là m tgiao di n có ph ng pháp có th c g i t m t máy o Java. B t k i t ng mà th c hi n giao di nnày có th là m t i t ng t xa.

Là m t thành viên c a m t giao di n t xa, ph ng pháp executeTask là m t ph ng pháp t xa. Vì v y,

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 5/21

ph ng pháp này ph i c xác nh là có kh n ng ném m tjava.rmi.RemoteException. Ngo i lnày c ném ra b i h th ng RMI t m t l i g iph ng th c t xa cho bi t r ng ho c làm t th t b i truy n thông ho c m t giao th cl i ã x y ra. RemoteException là m t ngo i l ki mtra, vì v y b t k mã g i m t ph ng th c t xa c n ph i x lý ngo i l này b ng cách b t ho c tuyênb nó trong i u kho nném.

Giao di n th hai c n thi t cho các công c tính toán là giao di n Task, ó làki u c a cáctham s ph ng pháp executeTask trong giao di n Tính. Giao di n compute.Task nhngh a các giao di n gi a các công c tính toán và công vi c mà nó c n làm, cung c p các cách b t

u công vi c. D i ây là mã ngu n cho công tác giao di n:

package compute;

public interface Task<T> {T execute();

}

Giao di n công tác xác nh m t ph ng pháp duy nh t, th c hi n, không có các thông s và ném khôngcó tr ng h p ngo i l . B i vì giao di n không m r ng t xa, các ph ng pháp trong giao di nnày không c n vào danh sách java.rmi.RemoteException trong i u kho n ném.

Giao di n công tác có m t tham s ki u, T, i di n cho các ki u k t qu c a tính toán c anhi mv . Ph ng pháp th c hi n c a giao di n này tr v k t qu c a tính toán và do óki u tr v c a nólà T.

Ph ng pháp executeTask giao di n Tính, l n l t, tr v k t qu c a vi c th c hi n các ví d côngtác c truy n cho nó. Vì v y, các ph ng pháp executeTask có tham s ki uriêng c a mình, T, ólà liên k t ki u tr v c a nó v i các lo i k t qu c a công tác thông qua các ví d .

RMI s d ng c ch tu n t hóa i t ng Java v n chuy n các i t ng theo giátr gi a các máy o Java. i v i m t i t ng c coi là tu n t , các l p h c ph i th chi n giaodi n ánh d u java.io.Serializable. Vì v y, các l p h c th c hi n công tác giao di n c ng ph i th chi n Serializable, các l p h c c a các i t ng s d ng cho k t qu nhi m v .

Các lo i nhi m v khác nhau có th c i u hành b i m t i t ng Tính toán mi n là chúngc tri n khai th c hi n c a các lo i công tác. Các l p h c th c hi n giao di n này có th ch a b t

k d li u c n thi t cho vi c tính toán các nhi m v và b t k ph ngpháp khác c n thi t tính toán.

D i ây là nh th nào RMI làm cho công c tính toán n gi n này có th . B i vì RMI có th ginh r ng các i t ng công tác c vi t b ng ngôn ng l p trình Java, vi c tri n khai c a i

t ng công tác mà tr c ây ch a bi t n công c tính toán c t i xu ngb i RMI vàomáy o Java c a các công c tính toán khi c n thi t. Kh n ng này cho phépkhách hàng c a các côngc tính toán xác nh các lo i m i c a nhi m v c ch ytrên máy ch mà không c n mã c rõràng cài t trên máy ó.

Các công c tính toán, th c hi n b i l p ComputeEngine, th c hi n các giao di n Tính toán, chophép các nhi m v khác nhau c trình cho nó b ng cách g i ph ngphápexecuteTask c a nó. Nh ng nhi m v này c ch y b ng cách s d ng th c hi n nhi m vc a ph ng th c th c hi n và k t qu c tr v cho khách hàng t xa

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 6/21

Th c hi n m t giao di n t xa

Ph n này bàn v các nhi m v th c hi n m t l p h c cho các công c tính toán. Nói chung, m t l p màth c hi n m t giao di n t xa ít nh t là nên làm nh sau:

Khai báo các giao di n t xa ang c th c hi nXác nh xây d ng cho t ng i t ng t xaCung c p m t th c hi n i v i t ng ph ng th c t xa trong các giao di n t xaM t ch ng trình máy ch RMI c n t o ra các i t ng t xa ban u và xu t kh uth i gianch y RMI, mà làm cho h có s n nh n c l i g i t xa n. Th t c thi t l p này có th c góig n trong m t ph ng pháp c a các l p th c hi n t xa i t ng chính nó ho c bao g m trong m t l pkhác hoàn toàn. Các th t c thi t l p nên làm nh sau:

T o và cài t m t ng i qu n lý an ninhT o và xu t kh u m t ho c nhi u i t ng t xa

ng ký ít nh t m t i t ng t xa v i c quan ng ký RMI (ho c v i m t d ch v ttên, ch ng h n nh m t d ch v truy c p thông qua t tên Java và Directory Interface) cho các m c

ích bootstrappingVi c th c hi n y các công c tính toán sau. Engine.ComputeEngine th c hi n cácgiao di n txa Tính toán và c ng bao g m các ph ng pháp chính thi t l p các công c tính toán. D i ây làmã ngu n cho các l p ComputeEngine:

package engine;

import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import java.rmi.server.UnicastRemoteObject;import compute.Compute;import compute.Task;

public class ComputeEngine implements Compute {

public ComputeEngine() {super();

}

public <T> T executeTask(Task<T> t) {return t.execute();

}

public static void main(String[] args) {if (System.getSecurityManager() == null) {

System.setSecurityManager(new SecurityManager());}try {

String name = "Compute";Compute engine = new ComputeEngine();Compute stub =

(Compute) UnicastRemoteObject.exportObject(engine, 0);Registry registry = LocateRegistry.getRegistry();registry.rebind(name, stub);System.out.println("ComputeEngine bound");

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 7/21

} catch (Exception e) {System.err.println("ComputeEngine exception:");e.printStackTrace();

}}

}

Các ph n sau ây th o lu n v m i thành ph n c a vi c th c hi n công c tính toán.

Kê khai các giao di n t xa c th c hi nL p th c hi n cho các công c tính toán c khai báo nh sau:

public class ComputeEngine implements Compute

Này tuyên b r ng l p th c hi n giao di n Tính t xa và do ó có th c s d ng cho m t it ng t xa.

L p ComputeEngine nh ngh a m t l p i t ng th c hi n t xa mà th c hi n m t giao di n duynh t t xa và không có giao di n khác. L p ComputeEngine c ng bao g m hai y u t ch ng trình th c

thi mà ch có th c vi n d n t i a ph ng. Vi c u tiên c acác y u t này là xây d ng chocác tr ng h p ComputeEngine. Th hai c a các y u t này là m t ph ng pháp chính c s d ng

t o ra m t th hi n ComputeEngine vàlàm cho nó có s n cho khách hang

Xác nh xây d ng cho các i t ng t xa

L p ComputeEngine có m t constructor không có i s . Mã cho các nhà xây d ng nh sau: public ComputeEngine() {

super();}Xây d ng này ch c n g i các nhà xây d ng l p cha, ó là các nhà xây d ng không có is c a l p it ng. M c dù các nhà xây d ng l p cha c g i ngay c khi b qua các nhà xâyd ng ComputeEngine, nó c bao g m cho rõ ràng.

Cung c p Tri n khai cho m i ph ng pháp t xa

Các l p h c cho m t i t ng t xa cung c p tri n khai th c hi n i v i t ng ph ng th c t xa quynh t i các giao di n t xa. Tính toán giao di n ch a m t ph ng pháp duy nh t t

xa, executeTask, c th c hi n nh sau:

public <T> T executeTask(Task<T> t) {return t.execute();

}Ph ng pháp này th c hi n các giao th c gi a các i t ng ComputeEngine t xa vàcác kháchhàng c a nó. M i khách hàng cung c p các ComputeEngine v i m t i t ngcông tác ã th c hi n c

th c a ph ng pháp th c hi n c a giao di n nhi m v c a.ComputeEngine th c hi n nhi m v c at ng khách hàng và tr v k t qu c a ph ng pháp th c hi n nhi m v tr c ti p cho khách hàng.

i qua các i t ng trong RMI

i s ho c tr l i giá tr t ph ng pháp i u khi n t xa có th c h u nh b t k lo i nào, bao g mc i t ng a ph ng, các i t ng t xa, và d li u nguyên th y các lo i. Chính xác h n, b t kth c th nào c a b t k lo i có th c thông qua ho c t m t ph ng pháp t xa nh m t th c th làm t th hi n c a m t lo i ó là m t ki u d li u nguyên th y, m t i t ng t xa, ho c m t i t ng

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 8/21

serializable, mà có ngh a là nó th c hi n giao di n java.io.Serializable.

M t s lo i i t ng không áp ng các tiêu chí này và do ó không th c thông qua ho c tr v tm t ph ng pháp t xa. H u h t các i t ng này, ch ng h n nh ch ho c mô t t p tin, óng góithông tin có ý ngh a ch trong vòng m t không gian a ch duy nh t. Nhi u ng i trong s các l p c t lõi,bao g m c các l p trong gói java.lang và java.util, th c hi n các giao di n Serializable.

Các quy t c i u ch nh nh th nào i s và giá tr tr l i c thông qua nh sau:

i t ng t xa ch y u là thông qua tham kh o. M t tài li u tham kh o i t ng t xa là m t bài, mà làm t proxy phía máy khách th c hi n các thi t l p y các giao di n t xa mà các i t ng t xa th chi n.Các i t ng a ph ng c thông qua b ng cách sao chép, s d ng tu n t hóa i t ng. Theom c nh, t t c các l nh v c c sao chép, ngo i tr các l nh v c c ánh d u t nh ho c thoángqua. Hành vi m c nh tu n t có th c ghi è trên m t c s l p h c theo l p.

i qua m t i t ng t xa b ng cách tham kh o có ngh a là b t k thay i c th c hi n v i tr ngthái c a i t ng b ng l i g i ph ng th c t xa c ph n ánh trong các i t ng t xa ban

u. Khi m t i t ng t xa c thông qua, ch nh ng giao di n mà giao di n t xa có s n cho ng inh n. B t k ph ng pháp quy nh t i các l p th c hi n ho c quy nh trong giao di n t xa c th chi n b i l p không có s n nh n ó.

Ví d , n u b n ã v t qua m t tham chi u n m t th hi n c a l p ComputeEngine, ng i nh n s cóquy n truy c p duy nh t ph ng pháp executeTask các công c tính toán. ó là nh n s không nhìnth y ComputeEngine các nhà xây d ng, ph ng pháp chính c a nó, ho c th c hi n b t k ph ng phápc a java.lang.Object.

Trong các thông s và giá tr tr l i các l i g i ph ng th c t xa, các i t ng mà không ph i là it ng t xa thông qua giá tr . Vì v y, m t b n sao c a i t ng c t o ra trong nh n c máy oJava. B t k thay i i v i nhà n c c a i t ng b ng cách nh n c ph n ánh trong b n sao c ang i nh n, không ph i trong tr ng h p ban u c a ng i g i. B t k thay i tr ng thái c a it ng ng i g i c ph n ánh trong tr ng h p ban u c a ng i g i, không có trong b n sao c ang i nh n.

Th c hi n ph ng pháp chính c a máy ch

Các ph ng pháp ph c t p nh t c a vi c th c hi n ComputeEngine là ph ng phápchính. Ph ngpháp chính c s d ng b t u ComputeEngine và do ó c n ph ilàm vi c kh i t o c n thi t nhàc a chu n b máy ch ch p nh n cu c g i t kháchhàng. Ph ng pháp này không ph i là m tph ng pháp t xa, mà có ngh a là nó khôngcó th c g i t m t máy o Java khác nhau. B ivì ph ng pháp chính là tuyên b t nh, ph ng pháp này không liên k t v i m t i t ng t t c mà

úng h n là v i cácl p ComputeEngine.

T o và cài t m t Security Manager

Nhi m v u tiên c a ph ng pháp chính là t o ra và cài t m t trình qu n lý an ninh,b o v truy c pvào tài nguyên h th ng t mã t i v không tin c y ch y trong máy oJava. M t nhà qu n lý anninh xác nh li u t i v mã có quy n truy c p h th ng t p tin a ph ng ho c có th th c hi n b tk ho t ng c quy n khác.

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 9/21

N u m t ch ng trình RMI không cài t m t trình qu n lý an ninh, RMI s không t i v các l ph c (h n t các con ng l p a ph ng) cho các i t ng nh n c nh các i s ho c giá tr trl i các l i g i ph ng th c t xa. H n ch này m b o r ng cácho t ng th c hi n b ng mã s t iv là m t chính sách b o m t.

D i ây là o n mã t o ra và cài t m t trình qu n lý an ninh:

if (System.getSecurityManager() == null) {System.setSecurityManager(new SecurityManager());

}

Các i t ng t xa có s n cho khách hàng

Ti p theo, các ph ng pháp t o ra m t th hi n c a ComputeEngine và xu t kh u th i gian ch y RMIv i các báo cáo sau ây:

Compute engine = new ComputeEngine();Compute stub =

(Compute) UnicastRemoteObject.exportObject(engine, 0);

Ph ng pháp UnicastRemoteObject.exportObject t nh xu t kh u i t ng cung c p t xa nó có thnh n c vi n d n các ph ng pháp t xa t các khách hàng t xa. i s th hai, m t int, xác nhc ng TCP s d ng l ng nghe cho các yêu c u g i n t xa cho các i t ng. Nó c ph bi n s d ng các giá tr s không, trong ó quy nh c th vi c s d ng m t c ng vô danh. C ng th c t sau

ó s c l a ch n t i th i gian ch y c a RMI ho c v n hành h th ng c b n. Tuy nhiên, m t giá trkhác không c ng có th c s d ng xác nh m t c ng c th s d ng cho nghe. Khi g iexportObject ã tr l i thành công, các i t ng ComputeEngine t xa ã s n sàng x lý các l i g it xa n.

Các ph ng pháp exportObject tr v m t stub cho i t ng t xa xu t kh u. L u ý r ng các lo i stubbi n ph i Tính toán, không ComputeEngine, b i vì còn s khai cho m t i t ng t xa ch th c hi n cácgiao di n t xa mà xu t kh u th c hi n i t ng t xa.

Ph ng pháp exportObject tuyên b r ng nó có th ném m t RemoteException, mà là m t lo i ngo i lki m tra. Các ph ng pháp x lý ngo i l này v i c g ng c a nó / kh i catch. N u tr ng h p ngo i lkhông c x lý theo cách này, RemoteException s ph i c khai báo trong m nh throws c aph ng pháp chính. M t c g ng xu t kh u m t i t ng t xa có th ném m t RemoteExceptionn u các ngu n l c thông tin liên l c c n thi t không có s n, ch ng h n nh n u các c ng c yêu c uràng bu c i v i m t s m c ích khác.

Tr c khi m t khách hàng có th g i m t ph ng th c trên m t i t ng t xa, nó tr c tiên ph i cóc m t tham chi u n các i t ng t xa. L y m t tham chi u có th c th c hi n trong cùng m t

cách b t k tài li u tham kh o i t ng khác thu c trong m t ch ng trình, ch ng h n nh b ng

cách tham chi u nh là m t ph n c a giá tr tr v c a m t ph ng pháp ho c nh là m t ph n c a m tc u trúc d li u có ch a m t tham chi u nh v y.

H th ng này cung c p m t lo i i t ng t xa, c quan ng ký RMI, cho vi c tìm ki m tài li u thamkh o cho các i t ng khác t xa. Vi c ng ký RMI là m t i t ng t xa n gi n t tên d ch vcho phép khách hàng có c m t tham chi u n m t i t ng i u khi n t xa b ng tên. ng kýlà th ng ch c s d ng xác nh v trí các i t ng u tiên t xa mà m t khách hàng RMI nhuc u s d ng. ó là i t ng t xa u tiên sau ó có th cung c p h tr cho vi c tìm ki m các i

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 10/21

t ng khác.

Java.rmi.registry.Registry giao di n t xa là các API cho các ràng bu c (ho c ng ký) và tìm ki m it ng t xa trong registry. L p java.rmi.registry.LocateRegistry cung c p các ph ng pháp t nh t ngh p m t tham chi u t xa ng ký m t a ch m ng c th nào ó (host và c ng). Nh ng ph ngpháp này t o ra các i t ng tham chi u t xa ch a a ch m ng quy nh mà không th c hi n b t kthông tin liên l c t xa.LocateRegistry c ng cung c p ph ng th c t nh t o ra m t ng ký m i trongmáy o Java hi n t i, m c dù i u này ví d không s d ng các ph ng pháp ó. M t khi m t i t ngt xa c ng ký v i m t RMI registry trên các máy ch a ph ng, khách hàng trên máy ch b t kcó th tìm ki m các i t ng t xa theo tên, có c tham chi u c a nó, và sau ó g i các ph ngth c t xa trên các i t ng. Vi c ng ký có th c chia s b i t t c các máy ch ang ch y trênmáy ch , ho c m t quá trình máy ch cá nhân có th t o ra và s d ng ng ký c a riêng mình.

L p ComputeEngine t o ra m t tên cho các i t ng v i các báo cáo sau ây:

String name = "Compute";Mã này sau ó thêm tên ng ký RMI ch y trên máy ch . B c này c th c hi n sau ó v i nh ng

i u kho n sau ây:

Registry registry = LocateRegistry.getRegistry();registry.rebind(name, stub);

G i rebind này làm cho m t cu c g i t xa ng ký RMI trên máy ch c c b . Gi ng nh b t k cu cg i t xa, cu c g i này có th d n n m t RemoteException c ném ra, c x lý b i các kh icatch cu i c a ph ng pháp chính.

L u ý sau ây v l i c u Registry.rebind:

Tình tr ng quá t i không có i s c a LocateRegistry.getRegistry t ng h p m t tài li u tham kh o ng ký trên các máy ch a ph ng và trên c ng ng ký m c nh, 1099.B n ph i s d ng m t tình

tr ng quá t i mà có m t tham s int n u ng ký c t o ra trên m t c ng khác h n so v i 1099.Khi m t l i g i t xa trên registry c th c hi n, m t stub cho i t ng t xa thông qua thay vì m tb n sao c a các i t ng t xa. i t ng th c hi n t xa, ch ng h n nh các tr ng h pComputeEngine, không bao gi r i kh i máy o Java, trong ó h c t o ra. Vì v y, khi m t kháchhàng th c hi n m t tra c u trong ng ký i t ng t xa c a m t máy ch , m t b n sao c a stub ctr v . Các i t ng t xa trong tr ng h p này là do ó có hi u qu thông qua (t xa) tham kh o chkhông ph i b i giá tr .Vì lý do an ninh, m t ng d ng ch có th ràng bu c, m ra, ho c rebind các tham chi u i t ng t xav i m t ng ký ch y trên cùng m t máy ch l u tr . H n ch này ng n c n m t khách hàng t xa lo ib ho c ghi è lên b t k m c trong registry c a máy ch .M t tra c u, tuy nhiên, có th c yêu c u tb t k máy ch l u tr , a ph ng ho c t xa.M t khi máy ch ã ng ký v i c quan ng ký RMI a ph ng, nó in m t thông báo ch ra r ng nó ãs n sàng b t u x lý các cu c g i. Sau ó, ph ng pháp chính hoàn thành. Nó không ph i là c nthi t có m t thread ch i gi cho máy ch còn s ng. Mi n là có m t tham chi u n i t ngComputeEngine trong m t máy o Java, a ph ng ho c t xa, các i t ng ComputeEngine không

s c óng c a ho c thu gom rác th i. B i vì ch ng trình liên k t v i m t tham chi u n cácComputeEngine trong registry, nó có th truy c p t m t khách hàng t xa, ng ký chính nó. H th ngRMI gi ch y quá trình này c a ComputeEngine. ComputeEngine hi n có s n ch p nh n cu c g i vàs không c khai hoang cho n khi ràng bu c c a nó c l y ra t ng ký và không có khách hàngt xa t ch c m t tham chi u t xa các i t ng ComputeEngine.

Giai o n cu i cùng c a mã trong các ph ng pháp ComputeEngine.main x lý b t k tr ng h p ngo il có th phát sinh. Các lo i ngo i l ch ki m tra có th c ném ra trong các mã RemoteException,ho c b ng cách g i UnicastRemoteObject.exportObject ho c b ng cách g i rebind ng ký. Trong c haitr ng h p, ch ng trình không có th làm nhi u h n so v i xu t c nh sau khi in m t thông báo

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 11/21

l i. Trong m t s ng d ng phân tán, ph c h i t s th t b i làm cho m t l i g i t xa là có th . Ví d ,các ng d ng có th c g ng th l i các ho t ng ho c l a ch n m t máy ch ti p t c ho t ng.

T o m t ch ng trình Khách hàng

Các công c tính toán là m t ch ng trình t ng i n gi n: nó ch y nhi m v c giao cho nó. Cáckhách hàng cho các công c tính toán ph c t p h n. Khách hàng c n g i các công c tínhtoán, nh ng nó c ng có xác nh các nhi m v c th c hi n b i các công c tính toán.

Hai l p riêng bi t làm cho khách hàng trong ví d c a chúng tôi. L p u tiên, ComputePi,nhìnlên và g i m t i t ng Tính toán. L p th hai, Pi, th c hi n công tác giao di n vàquy nh nh ngvi c c th c hi n b i các công c tính toán. Công vi c c a l p Pi là tính toán giá tr c a m t ss ch s th p phân.

Giao di n công tác t xa không c nh ngh a nh sau:

package compute;

public interface Task<T> {T execute();

}

Mã mà g i ph ng pháp m t i t ng Tính toán ph i có c m t tham chi u n i t ng ó, t o ram t i t ng công tác, và sau ó yêu c u nhi m v c th c hi n. nh ngh a c a l p nhi mv Pi c hi n th sau này. M t i t ng Pi c xây d ng v i m t i s duy nh t, chínhxác mong mu n c a k t qu . K t qu c a vi c th c hi n nhi m v là m t java.math.BigDecimal i di ncho tính toán chính xác quy nh.

D i ây là mã ngu n cho client.ComputePi, l p khách hàng chính:package client;

import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import java.math.BigDecimal;import compute.Compute;

public class ComputePi {public static void main(String args[]) {

if (System.getSecurityManager() == null) {System.setSecurityManager(new SecurityManager());

}try {

String name = "Compute";Registry registry = LocateRegistry.getRegistry(args[0]);Compute comp = (Compute) registry.lookup(name);Pi task = new Pi(Integer.parseInt(args[1]));BigDecimal pi = comp.executeTask(task);System.out.println(pi);

} catch (Exception e) {System.err.println("ComputePi exception:");

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 12/21

e.printStackTrace();}

}}

Gi ng nh máy ch ComputeEngine, khách hàng b t u b ng cách cài t m t ng i qu nlý b o m t. B c này là c n thi t b i vì quá trình nh n c còn s khai c a i t ng máy ch txa có th yêu c u t i v các nh ngh a l p t máy ch . i v i RMI t i v các l p h c, m t ng iqu n lý b o m ph i có hi u l c.

Sau khi cài t m t ng i qu n lý b o m t, khách hàng xây d ng m t tên s d ng tìm ki m m t it ng Compute t xa, s d ng cùng tên c s d ng b i ComputeEngine ràng bu c i t ng txa c a nó. Ngoài ra, khách hàng s d ng các APILocateRegistry.getRegistry t ng h p m t thamchi u t xa ng ký trên máy ch c a máy ch . Giá tr c a i s dòng l nh u tiên, args [0], làtên c a máy ch t xa mà trên ó các i t ng Tính ch y. Các khách hàng sau ó g i ph ngpháp tra c u trên registry tìm ki m các i t ng i u khi n t xa b ng tên trong ng ký các máych c a máy ch . Tình tr ng quá t i c bi t c a LocateRegistry.getRegistry s d ng, trong ó cóm t tham s chu i duy nh t, tr v m t tham chi u ng ký t i các máy ch c t tên và ngký m c nh c ng, 1099. B n ph i s d ng m t tình tr ng quá t i mà cóm t tham s int n u ngký c t o ra trên m t c ng khác h n so v i 1099.

Ti p theo, khách hàng t o ra m t i t ng Pi m i, i qua các nhà xây d ng Pi giá tr c a i s dòngl nh th hai, args [1], phân tích cú pháp là m t s nguyên. L p lu n nàycho th y s l ng ch s th pphân s d ng trong tính toán. Cu i cùng, khách hàngg i ph ng pháp executeTask c a i t ng txa Tính toán. Các i t ng c thôngqua vào g i executeTask tr v m t i t ngc a lo i BigDecimal, các c a hàngch ng trình trong k t qu bi n. Cu i cùng, ch ng trình inra k t qu . Hình d i ây môt dòng ch y c a thông i p gi a các kháchhàng ComputePi, rmiregistry, vàComputeEngine.

L p Pi th c hi n công tác giao di n và tính giá tr c a m t s quy nh c a ch s th p phân. i v i víd này, các thu t toán th c t là không quan tr ng. i u quan tr ng là thu t toán tính toán t ti n, cóngh a là b n s mu n có nó th c hi n trên m t máy ch có kh n ng.

D i ây là mã ngu n cho client.Pi, l p th c hi n công tác giao di n:

package client;

import compute.Task;import java.io.Serializable;import java.math.BigDecimal;

public class Pi implements Task<BigDecimal>, Serializable {

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 13/21

private static final long serialVersionUID = 227L;

/** constants used in pi computation */private static final BigDecimal FOUR =

BigDecimal.valueOf(4);

/** rounding mode to use during pi computation */private static final int roundingMode =

BigDecimal.ROUND_HALF_EVEN;

/** digits of precision after the decimal point */private final int digits;

/*** Construct a task to calculate pi to the specified* precision.*/

public Pi(int digits) {this.digits = digits;

}

/*** Calculate pi.*/

public BigDecimal execute() {return computePi(digits);

}

/*** Compute the value of pi to the specified number of* digits after the decimal point. The value is* computed using Machin's formula:** pi/4 = 4*arctan(1/5) - arctan(1/239)** and a power series expansion of arctan(x) to* sufficient precision.*/

public static BigDecimal computePi(int digits) {int scale = digits + 5;BigDecimal arctan1_5 = arctan(5, scale);BigDecimal arctan1_239 = arctan(239, scale);BigDecimal pi = arctan1_5.multiply(FOUR).subtract(

arctan1_239).multiply(FOUR);return pi.setScale(digits,

BigDecimal.ROUND_HALF_UP);

}/*** Compute the value, in radians, of the arctangent of* the inverse of the supplied integer to the specified* number of digits after the decimal point. The value* is computed using the power series expansion for the* arc tangent:** arctan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 +* (x^9)/9 ...

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 14/21

*/public static BigDecimal arctan(int inverseX,

int scale){

BigDecimal result, numer, term;BigDecimal invX = BigDecimal.valueOf(inverseX);BigDecimal invX2 =

BigDecimal.valueOf(inverseX * inverseX);

numer = BigDecimal.ONE.divide(invX,scale, roundingMode);

result = numer;int i = 1;do {

numer =numer.divide(invX2, scale, roundingMode);

int denom = 2 * i + 1;term =

numer.divide(BigDecimal.valueOf(denom),

scale, roundingMode);if ((i % 2) != 0) {result = result.subtract(term);

} else {result = result.add(term);

}i++;

} while (term.compareTo(BigDecimal.ZERO) != 0);return result;

}}

L u ý r ng t t c các l p tu n t , cho dù h th c hi n các giao di n Serializable tr c ti p ho c gián ti p,ph i tuyên b m t l nh v c t nhân t nh cu i cùng có tên là serialVersionUID m b o kh n ngt ng thích serialization gi a các phiên b n. N u không có phiên b n tr c c a l p h c ã c pháthành, thì giá tr c a l nh v c này có th c b t k giá tr lâu dài, t ng t nh các 227L c s d ngb i Pi, mi n là giá tr c s d ng nh t quán trong các phiên b n trong t ng lai. N u m t phiên b ntr c c a l p ã c phát hành mà không có m t tuyên b rõ ràng serialVersionUID, nh ng kh n ngt ng thích serialization v i phiên b n ó là quan tr ng, sau ó m c nh ng m tính toán giá tr so v iphiên b n tr c ó ph i c s d ng cho giá tr c a vi c kê khai rõ ràng các phiên b n m i. Các côngc serialver có th c ch y cho các phiên b n tr c ó xác nh tính giá tr m c nh cho nó.

Các tính n ng thú v nh t c a ví d này là i t ng th c hi n Tính toán không bao gi c n nh ngh al p Pi Pi cho n khi m t i t ng ã c thông qua t i nh m t i s cho ph ng pháp

executeTask. T i th i i m ó, các mã cho các l p h c c n p b i RMI vào máy o Java c a các it ng Tính toán, ph ng pháp th c thi c g i, và mã nhi m v c th c hi n. K t qu , trong tr ngh p c a nhi m v Pi là m t i t ng BigDecimal, c giao l i cho khách hàng g i i n tho i, n i nó

c s d ng in k t qu tính toán.

Th c t là i t ng công tác cung c p tính toán giá tr c a Pi là không liên quan n i t ngComputeEngine. B n c ng có th th c hi n m t nhi m v , ví d , t o ra m t s ng u nhiên nguyên tb ng cách s d ng m t thu t toán xác su t. Nhi m v ó c ng s c tính toán chuyên sâu và do ó

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 15/21

m t ng c viên t t thông qua các ComputeEngine, nh ng nó s yêu c u mã r t khác nhau. Mã nàyc ng có th c t i v khi các i t ng công tác c thông qua m t i t ng Tính toán. B ng cáchch r ng các thu t toán cho máy tính c a vào khi c n thi t, mã t o ra các s ng u nhiên chính s

c a ra khi c n thi t. Các i t ng Tính toán ch bi t r ng m i i t ng mà nó nh n c th chi n các ph ng pháp th c hi n. i t ng Tính không bi t, và không c n bi t, nh ng gì th c hi n.

Biên so n ch ng trình ví d

Trong m t k ch b n th c th gi i trong ó m t d ch v nh các công c tính toán c tri n khai, m t nhàphát tri n có th s t o ra m t Java Archive (JAR) t p tin có ch a các giao di n Tính toán và côngtác cho các l p h c máy ch th c hi n và các ch ng trìnhkhách hàng s d ng. Ti p theo, m tnhà phát tri n, có l là nhà phát tri n cùng m t t p tin JAR giao di n, s vi t m t th c hi n c a giaodi n Tính và tri n khai d ch v trên m t máy tính có s n cho khách hàng. Phát tri n các ch ngtrình khách hàng có th s d ngTính toán và giao di n công tác, ch a trong các t p tin JAR, và cl p phát tri n m t ch ng trình nhi m v và khách hàng s d ng d ch v Tính toán.

Trong ph n này, b n tìm hi u làm th nào thi t l p các t p tin JAR, các l p h c máych , và các l ph c c a khách hàng. B n s th y r ng l p Pi c a khách hàng s c t i v máy ch t i th i gianch y. Ngoài ra, các giao di n Tính toán và công tác s c t i v t máy ch ng ký trong th i gianch y.Ví d này phân bi t các giao di n, th c hi n i t ng t xa, và mã khách hàng thành bagói:

compute ± Compute and Task interfaces

engine ± ComputeEngine implementation class

client ± ComputePi client code and Pi task implementation

Tr c tiên, b n c n ph i xây d ng các t p tin JAR giao di n cung c p cho máy ch vàphát tri n khách hàng.

Xây d ng m t t p tin JAR các l p giao di nTr c tiên, b n c n ph i biên d ch t p tin mã ngu n giao di n trong các gói ph n m m tính toán và sau

ó xây d ng m t t p tin JAR ch a các t p tin l p h c c a h . Gi s r ngng i s d ng Waldo ãvi t các giao di n này và t các file ngu n trong th m c c: \ nhà\ Waldo \ src \ tính toán trên Windowsho c th m c / home / Waldo / src / tính toán trên h i u hành Solaris ho c Linux. V i nh ng con

ng, b n có th s d ng các l nh sau biên d ch các giao di n và t o ra các t p tin JAR:

Microsoft Windows :

cd c:\home\waldo\srcjavac compute\Compute.java compute\Task.javajar cvf compute.jar compute\*.class

Solaris OS or Linux :

cd /home/waldo/srcjavac compute/Compute.java compute/Task.javajar cvf compute.jar compute/*.class

L nh jar hi n th u ra sau ây do tùy ch n-v:

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 16/21

added manifestadding: compute/Compute.class(in = 307) (out= 201)(deflated 34%)adding: compute/Task.class(in = 217) (out= 149)(deflated 31%)

Bây gi , b n có th phân ph i các t p tin compute.jar t i các nhà phát tri n c a máy ch và các ngd ng c a khách hàng h có th làm cho vi c s d ng các giao di n.

Sau khi b n xây d ng m t trong hai phía máy ch ho c khách hàng phía các l p h c v itrình biênd ch javac, n u có c a nh ng l p h c s c n ph i c t ng t i v các máy oJava, b n ph i m b o r ng các t p tin l p h c c a h c t m t v trí truy c pm ng. Trong víd này, i v i h i u hành Solaris ho c Linux v trí này là / home / user /public_html / l p vì nhi u máych web cho phép truy c p vào th m c public_html c a ng i dùng thông qua m t URL HTTP c xâyd ng nh là ng i s d ng ~ http://host//. N u máy ch web c a b n không h tr h i ngh này, b n cóth s d ng m t v trí khác nhau trong h th ng phân c p c a máy ch web c a, ho c b n có th sd ng m t URLt p tin thay vì. Các URL t p tin các t p tin d ng: / home / user / public_html / l p / trên h

i u hành Solaris ho c Linux và các hình th c t p tin: / c: / home / user / public_html /classes / trênWindows. B n c ng có th ch n m t d ng khác c a URL, khi thích h p.

Kh n ng ti p c n m ng l i c a các t p tin l p h c cho phép th i gian ch y RMI t i v mã khi c nthi t. Thay vì xác nh giao th c riêng c a nó t i v mã, RMI s d nggiaoth c URL c h tr b i n n t ng Java (ví d , HTTP) t i v mã. L u ý r ng b ng cách s d ngm t máy ch web y n ng ph c v các t p tin l p h c là không c n thi t. Víd , m t máy ch HTTP n gi n cung c p các ch c n ng c n thi t làm chocác l p h c có s n t iv trong RMI thông qua HTTP có th c tìm th y t i Trang ch G i Ph ng pháp t xa.

Xây d ng các l p h c máy ch

Các gói công c có ch a ch có m t l p th c hi n phía máy ch , ComputeEngine, vi c th chi n c a giao di n t xa Tính.

Gi s r ng ng i s d ng ann, nhà phát tri n c a l p ComputeEngine, ãtComputeEngine.java trong th m c c: \ nhà \ ann \ src \ công c trên Windows ho c th m c /

home / ann / src / ng c trên h i u hành Solaris ho c Linux. Cô ang tri n khaicác t p tin l ph c cho các khách hàng t i v trong m t th m c con c a thm cpublic_html c a cô, c: \ nhà \ ann \ public_html \ các l p h c trên Windows ho c /home /ann / public_html / l p h c trên h i u hành Solaris ho c Linux. V trí này có th truyc pthông qua m t s máy ch web nh http://host:port/ ~ ann / l p /.

L p ComputeEngine ph thu c vào các Tính toán và giao di n Task, c ch a trongfileJAR compute.jar. Vì v y, b n c n t p tin compute.jar trong ng d n l p h c c a b n khi b n xâyd ng các l p h c máy ch . Gi s r ng t p tin compute.jar là n m trong thm cc: \ nhà \ ann \ public_html \ các l p h c trên Windows ho c th m c / home / ann /public_html / l ph c trên h i u hành Solaris ho c Linux. V i nh ng con ng, b n có th s d ng các l nh sau ây

xây d ng các l p h c máy ch :

M icrosoft Windows :

cd c:\home\ann\srcjavac -cp c:\home\ann\public_html\classes\compute.jar

engine\ComputeEngine.java

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 17/21

Solaris OS or Linux :

cd /home/ann/srcjavac -cp /home/ann/public_html/classes/compute.jar

engine/ComputeEngine.java

Các l p stub cho ComputeEngine th c hi n giao di n Tính toán, trong ó c p n giao di n côngtác. Vì v y, các nh ngh a l p cho hai giao di n c n ph i c truy c p m ngcho stub c nh nb i máy o Java khác nh máy o Java registry. Khách hàng máy o Java ã có các giao di n này trong

ng d n l p h c c a mình, vì v y nó không th c s c n ph i t i v nh ngh a c a h . Các t ptin compute.jar d i th m c public_html có th ph c v m c ích này.

Bây gi , các công c tính toán là ã s n sàng tri n khai. B n có th làm i u ó ngay bây gi , ho cb n có th ch i cho n khi sau khi b n ã xây d ng các khách hàng.

Xây d ng các l p h c Khách hàng

Các gói ph n m m khách hàng bao g m hai l p, ComputePi, khách hàng ch ng trình chính, và Pi, c akhách hàng th c hi n công tác giao di n.

Gi s r ng ng i s d ng jones, nhà phát tri n c a các l p khách hàng ãtComputePi.java và Pi.java trong th m c c: \ nhà \ jones \ src \ client trên Windows ho cth m c /

home / jones / src / khách hàng trên h i u hành Solaris ho c Linux. Ông ang tri n khai các t p tin l ph c cho các công c tính toán t i v trong m t th m c conc a thm c public_html c a mình, c: \ nhà \ jones \ public_html \ các l p h c trên Windows ho c /home / jones / public_html / l p h c trên h i u hành Solaris ho c Linux. V trí nàycó th truyc p thông qua m t s máy ch web nh http://host:port/ ~ jones / l p /.

Các l p khách hàng ph thu c vào các Tính toán và giao di n Task, c ch a trong

fileJAR compute.jar. Vì v y, b n c n t p tin compute.jar trong ng d n l p h c c a b n khib n xâyd ng các l p khách hàng. Gi s r ng t p tin compute.jar là n m trong thm c c:\ nhà \ jones \ public_html \ các l p h c trên Windows ho c th m c /home / jones /public_html / l p h c trên h i u hành Solaris ho c Linux. V i nh ng con ng, b n cóth s d ng các l nh sau ây xây d ng các l p khách hàng:

M icrosoft Windows :

cd c:\home\jones\srcjavac -cp c:\home\jones\public_html\classes\compute.jar

client\ComputePi.java client\Pi.javamkdir c:\home\jones\public_html\classes\clientcp client\Pi.class

c:\home\jones\public_html\classes\client

Solaris OS or Linux :

cd /home/jones/srcjavac -cp /home/jones/public_html/classes/compute.jar

client/ComputePi.java client/Pi.javamkdir /home/jones/public_html/classes/client

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 18/21

cp client/Pi.class/home/jones/public_html/classes/client

Ch có l p Pi c n c t trong th m c public_html \ l p \ client b i vì ch có các l p Pic n ph i cós n t i v công c tính toán c a máy o Java. Bây gi , b n có th ch y cácmáy ch và client.

Ch y Ch ng Trình Ví d

L u ý v b o m tCác ch ng trình máy ch và máy khách ch y v i m t ng i qu n lý b o m t c cài t. Khi b nch y m t trong hai ch ng trình, b n c n ph i ch nh m t t p tin chính sách b o m t mã cc p các kho n b o m t c n thi t ch y. D i ây là m t t p tinchính sách ví d s d ngv i ch ng trình máy ch :

grant codeBase "file:/home/ann/src/" {

permission java.security.AllPermission;};

D i ây là m t t p tin chính sách ví d s d ng v i ch ng trình khách hàng:

grant codeBase "file:/home/jones/src/" {permission java.security.AllPermission;

};

i v i c hai t p tin chính sách ví d , t t c các quy n c c p cho các l p h c trong ng d n l p

h c c a ch ng trình a ph ng, b i vì các mã ng d ng a ph ng là áng tin c y, nh ng không cóquy n c c p mã t i v t các a i m khác. Do ó, cácmáy ch công c tính toán h n ch cácnhi m v mà nó th c hi n (có mã là không bi t n là áng tin c y và có th là thù ch) th c hi n b tk ho t ng òi h i ph i có i u kho n b o m t. Nhi m v Pi client ví d không yêu c u b t k i ukho n th c hi n.

Trong ví d này, các t p tin chính sách cho các ch ng trình máy ch c t tênlàserver.policy, và các t p tin chính sách cho ch ng trình khách hàng c t tên làclient.policy.

B t u t Server Tr c khi b t u các công c tính toán, b n c n b t u ng ký RMI. Vi c ng kýRMI là m t phíamáy ch n gi n bootstrap t tên c s cho phép khách hàng t xa có c m t tham chi u

n m t i t ng t xa ban u. Nó có th c b t u v i l nh rmiregistry. Tr c khi b n th chi n rmiregistry, b n ph i ch c ch n r ng v ho c c as trong ó b n s ch y rmiregistry ho c khôngcó thi t l p bi n môi tr ng CLASSPATHho c có m t bi n môi tr ng CLASSPATH mà không baog m ng d n n b t k l p h c mà b n mu n t i v cho các khách hàng c a b n t xa i t ng.

b t u ng ký trên máy ch , th c hi n l nh rmiregistry. L nh này s n xu t không có ura và th ng c ch y trong n n. i v i ví d này, ng ký là b t u vàoMyComputer ch nhà.

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 19/21

M icrosoft Windows (use javaw if start is not available):

start rmiregistry

Solaris OS or Linux :

rmiregistry &

Theo m c nh, ng ký ch y trên c ng 1099. b t u ng ký trên m t c ng khác nhau, xác nhs c ng trên dòng l nh. ng quên b t bi n môi tr ng CLASSPATH c ab n.

M icrosoft Windows :

start rmiregistry 2001

Solaris OS or Linux :rmiregistry 2001 &

Sau khi ng ký là b t u, b n có th kh i ng máy ch . B n c n ph i m b o r ng c hai t ptin compute.jar và th c hi n l p i t ng t xa trong con ng l p h c c a b n.Khi b n kh i ng

ng c tính toán, b n c n ph i ch nh, s d ng tài s njava.rmi.server.codebase, n i mà các l ph c c a máy ch truy c p m ng. Trong ví d này,các l p phía máy ch th c hi n có s n t iv Tính toán và giao di n Task, trong ó có s n trong các t p tin trong th m c public_html \ l ph c c a ng i s d ng anncompute.jar. Các máy ch tính toán ng c là b t u vào MyComputer máych , cùng m t máy ch mà trên ó ng ký c b t u.

M icrosoft Windows :

java -cp c:\home\ann\src;c:\home\ann\public_html\classes\compute.jar-

Djava.rmi.server.codebase=file:/c:/home/ann/public_html/classes/compute.jar-Djava.rmi.server.hostname=mycomputer.example.com-Djava.security.policy=server.policy

engine.ComputeEngine

Solaris OS or Linux :

java -cp /home/ann/src:/home/ann/public_html/classes/compute.jar-Djava.rmi.server.codebase=http://mycomputer/~ann/classes/compute.jar-Djava.rmi.server.hostname=mycomputer.example.com-Djava.security.policy=server.policy

engine.ComputeEngine

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 20/21

Java trên l nh nh thu c h th ng sau :

- Các tài s n java.rmi.server.codebase quy v trí, m t URL codebase, mà t ó các nh ngh a cho cácl p h c ngu n t máy ch này có th c t i v . N u codebase quy m t h th ng phân c p thm c (nh trái ng c v i m t t p tin JAR), b n ph i bao g m m td u g ch chéo ph ncu i c a URL codebase.- Các tài s n java.rmi.server.hostname xác tên máy ch ho c a a vào khai cho i t ng txa xu t trong máy o Java. Giá tr này là tên máy ch ho c a ch c b ikhách hàng khi h cg ng giao ti p l i g i ph ng th c t xa. Theo m c nh, vi c th c hi n RMI s a ch IP c a máych nh c ch ra b i các APIjava.net.InetAddress.getLocalHost. Tuy , ôi khi, a ch này là khôngthích h p cho t t c khách hàng và m t tên máy ch i u ki n s c hi u qu h n. mb o r ngRMI s d ng m t tên máy ch (ho c a ch IP) cho các máy ch ó có th nh tuy nchung t t t khách hàng ti m n ng, thi t l p thu c tính java.rmi.server.hostname.- Các tài s n java.security.policy c s d ng xác t p chính có ch a các i u kho nmà có ý

nh c p.

B t u t ClientSau khi ng ký và ng c tính toán ang ch y, b n có th b t u các khách hàng, quy nh c

th sau :Các v trí mà khách hàng ph c các l p h c (l p Pi) b ng s d ng tàijava.rmi.server.codebaseCác tài s n java.security.policy, c s d ng xác các chính sách b o m t t p có ch acác i ukho n b n có ý nh dành cho ph n khác nhau c a mãKhi i s dòng l nh, tên máy ch c a máy ch ( client bi t c n i xác nh v trí các i Tính t )và s th p phân s d ng trong tính toánB t cho khách hàng v m t máy ch (m t máy ch tên là mysecondcomputer, ví d ) nh sau:

M icrosoft Windows :

java -cp c:\home\jones\src;c:\home\jones\public_html\classes\compute.jar-Djava.rmi.server.codebase=file:/c:/home/jones/public_html/classes/-Djava.security.policy=client.policy

client.ComputePi mycomputer.example.com 45

Solaris OS or Linux :

java -cp /home/jones/src:/home/jones/public_html/classes/compute.jar-Djava.rmi.server.codebase=http://mysecondcomputer/~jones/classes/-Djava.security.policy=client.policy

client.ComputePi mycomputer.example.com 45

L u r ng ng d n l p h c c thi t l p trên dòng l nh các thông có th tìm th y cácl p client và t p tin JAR ch a các giao di n. C ng l u ý r ng giá tr c a tàis njava.rmi.server.codebase, trong ó quy m t h th ng phân c p th , k t thúc b ng m t d u g chchéo.

Sau khi b n b t các khách hàng, các u ra sau ây là hi n th :

3,141592653589793238462643383279502884197169399

8/3/2019 ĐỀ TÀI RMI FOR JAVA

http://slidepdf.com/reader/full/de-tai-rmi-for-java 21/21

Hình d i ây mô t rmiregistry, máy ch ComputeEngine, và client ComputePi có ccác l ph c trong quá trình th c hi n ch ng trình

Khi máy ch ComputeEngine liên k t tham chi u i t ng t c a nó registry t i Tính toánvà giaodi n nhi m v mà trên ó các l p h c còn s khai ph thu c. Các l p này c t i xu ng t m t tronghai máy ch web các máy ch ho c h th ng t p tin, tùy thu c vào lo i codebase URL c s d ngkhi b t các máy ch ComputeEngine.

B i vì các client ComputePi Tính toán và giao di n công tác có trong ng d n l p c a nó, nó sload nh ngh a c a chúng t ng d n l p h c, không ph i t c s mã c a máy ch .

Cu i cùng, l p Pi c n p vào máy o Java c a máy ch ComputeEngine khi các it ng Pi c thông qua t i cu c g i t xa executeTask i t ng ComputeEngine. L pPi c t i b icác máy ch ho c máy ch web c a khách hàng ho c h th ng t p tin, tùy thu c vàolo i codebase URL c s d ng khi b t các client.