Tải bản đầy đủ (.doc) (124 trang)

Phát triển tư duy thuật giải cho học sinh thông qua dạy học các cấu trúc điều khiển và các dữ liệu cóa cấu trúc tin học 11

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (886.23 KB, 124 trang )

Lời cảm ơn
Kính gởi lời cảm ơn chân thành nhất đến thầy Trương Hồng Lónh, người đã tận tình hướng
dẫn, giúp đỡ để đề tài luận văn này được hoàn thành.
Xin trân trọng cảm ơn thầy Lê Nam Hiến đã nhiệt tình chỉ dẫn chúng em trong giai đoạn
thực tập tốt nghiệp.
Xin gởi lời cảm ơn thương yêu nhất đến gia đình đã rất quan tâm và khuyến khích trong
suốt thời gian thực hiện đề tài tốt nghiệp này.
Cũng xin cảm ơn tất cả các thầy cô đã nhiệt tâm giảng dạy và những bạn bè đã gắn bó, hỗ
trợ chúng tôi.
Nguyễn Thanh Bình
Nguyễn Thò Thu Hiền

1
Giới thiệu đề tài
- IĐề tài
Tìm hiểu cơ chế RMI của Java và xây dựng một môi trường hỗ trợ
tính toán song song và phân bố .
- IIGiới thiệu
Luận văn này giới thiệu một phương hướng suy nghó và hiện thực một môi trường hỗ trợ
việc tính toán song song và phân bố bằng cách sử dụng cơ chế RMI trong Java. Chương
trình hiện thực của luận văn này là một ứng dụng cung cấp cho người sử dụng những tính
năng cơ bản để có thể điều khiển môi trường tính toán một cách dễ dàng tiện dụng.
Về những tính năng kỹ thuật của môi trường ta có thể nói rằng môi trường cho phép người
sử dụng có thể sử dụng các tài nguyên phân bố trên mạng. Cụ thể hơn, môi trường cung
cấp cho người sử dụng khả năng sử dụng bộ nhớ và khả năng xử lý của CPU của những
máy tính được nối với nhau trên mạng.
Chương trình hiện thực còn phục vụ được nhu cầu cần có một cơ chế truy xuất và quản lý
hiệu quả các tài nguyên tính toán trên mạng. Ngoài ra, chương trình còn thỏa mãn nhu cầu
về tính dễ sử dụng bằng cách cung cấp một giao diện thân thiện.
Tính dễ sử dụng là nhờ môi trường hiện thực ra không đòi hỏi một sự nổ lực lớn nào từ
phía người sử dụng hệ thống. Chiến lược về cân bằng tải và các chiến lược về Fault


Tolerance cho hệ thống cũng được quan tâm giải quyết.
Cuối cùng ta thấy, vì Java là một ngôn ngữ lập trình không phụ thuộc vào Platform, vì vậy
chương trình hiện thực được cũng không phụ thuộc Platform. Một cách rõ ràng hơn,
chương trình có thể chạy trên các hệ điều hành khác nhau một cách dễ dàng.
- IIISơ lược về yêu cầu đề tài
Bài toán đặt ra cho luận văn này là :
Một hệ thống máy tính gồm nhiều máy tính có khả năng tính toán lớn được nối kết trên
một mạng . Các máy này có thể đảm nhận việc thực hiện các dòch vụ tính toán lớn mà
chúng ta gọi là các Service. Yêu cầu đặt ra là xây dựng một hệ thống đóng vai trò là một
môi trường cho phép thực thi những bài toán tương đối lớn theo mô hình song song và
phân bố. Cơ chế hỗ trợ để xây dựng đề tài là RMI trong Java, là một cơ chế Distributed
Object.
1
Thực chất đây là hệ thống có nhiệm vụ quản lý những dòch vụ tính toán phân bố . Ngoài
việc phải phân phối công việc để thực hiện một yêu cầu dòch vụ nào đó, hệ thống còn có
các chức năng như vấn đề thêm dòch vụ, sửa hay xóa dòch vụ. Việc xây dựng chương trình
cũng giải quyết các vấn đề khá quan trọng của bất cứ hệ thống tính toán phân bố nào,
chẳng hạn vấn đề an toàn, bảo mật cho hệ thống, vấn đề kháng lỗi của hệ thống, vấn đề
về việc phân chia công việc giữa các máy trong hệ thống …
Về việc sử dụng hệ thống, người sử dụng (Client) từ một máy tính bình thường, sử dụng
môi trường lập trình có giao tiếp gọi hàm từ xa theo cơ chế RMI trong Java là đã có thể
truy xuất các dòch vụ tính toán có trong hệ thống. Người quản trò hệ thống (Admin) thông
qua chương trình Admin, do người hiện thực hệ thống cung cấp, sẽ quản lý các hoạt động
của hệ thống. Người phát triển dòch vụ sẽ xây dụng dòch vụ theo một chuẩn nhất đònh và
trao cho người Admin để người quản trò hệ thống có thể chạy thử. Sau đó, người Admin sẽ
thực hiện thêm dòch vụ vào hệ thống thông qua một số thao tác đơn giản trên chương trình
Admin.
Tóm lại, chúng ta cần giải quyết các vấn đề chính yếu sau :
• Làm thế nào Client có thể dễ dàng sử dụng được các Service trên các Server mà
không cần quan tâm đến phần tổ chức của các dòch vụ bên trong hệ thống.

• Admin có thể quản lý, thống kê việc truy xuất các dòch vụ từ các Client.
• Admin có thể quản lý, kiểm soát và thống kê hoạt động của các Server, cũng như
Service trên các Server ấy, để cho hệ thống hoạt động đạt hiệu quả cao nhất.
• Làm sao để có một cơ chế thuận lợi cho người phát triển thêm các dòch vụ cho hệ
thống mà không làm ảnh hưởng đến hoạt động của các dòch vụ đã có sẵn trước đó.
• Vấn đề khắc phục lỗi xảy ra trong quá trình vận hành hệ thống.
• Làm sao để thực hiện việc phân chia công việc sao cho hiệu quả nhất có thể.
Chiến lược để thực hiện việc phân chia này như thế nào.
• Cách giải quyết tình trạng tắc nghẽn có thể xảy ra của hệ thống.(Mô hình phải như
thế nào để giảm tình trạng tắc nghẽn này).
• Làm sao giải quyết các vấn đề ưu tiên trong hệ thống. Vì rất có thể trong quá trình
hoạt động của hệ thống sẽ có một số dòch vụ cần phải có độ ưu tiên cao.
Chương trình sẽ được hiện thực bằng ngôn ngữ Java. Tuy nhiên, bên cạnh việc tìm hiểu cơ
chế RMI, cần có thêm một cơ sở lý thuyết về một số cơ chế nhằm hỗ trợ trong việc xây
dựng chương trình. Các cơ sở lý thuyết cơ bản chẳng hạn thế nào là ứng dụng phân bố, các
cơ chế Serialization, Dynamic Class Loading, Security, Multithread, Registry, Codebase,
Activation, Naming… sẽ được trình bày cụ thể ở phần sau đây.
1
Phần 1 : Nghiên cứu lý thuyết
Chương 1 : Distributed
Application
Một ứng dụng phân bố là ứng dụng được phân bố trên nhiều không gian đòa chỉ khác nhau
hay trên nhiều máy khác nhau. Có nhiều phương pháp để xây dựng một ứng dụng phân
bố, ở đây ta sẽ quan tâm đến Distributed Object.
Cơ chế Distributed Object là cơ chế cho phép những object trên một máy tính nào đó gởi
những message đến những object chạy trên vùng không gian đòa chỉ bộ nhớ khác, thông
thường là thông qua mạng.
Khi cần thiết kế một hệ thống sử dụng cơ chế Distributed Object thì ta cần phải quản lý
được những vấn đề sau:
♦ Độc lập platform :

Trong một ứng dụng sử dụng cơ chế Distributed Object, sẽ tồn tại những dòch vụ chạy
trên những platform khác nhau, nhưng ta đòi hỏi chúng phải giao tiếp được với nhau.
Điều này cho thấy, việc độc lập platform là một vấn đề cần quan tâm. Ngoài ra, cơ
chế Transmission giữa những Distributed object này phải quản lý được Format dữ liệu
chẳng hạn như byte order.
♦ Location :
Trong môi trường sử dụng cơ chế Distributed Object , phải có một vài cơ chế cho việc
đònh vò object cung cấp dòch vụ, điều này nhằm cung cấp công cụ cho việc thông tin
liên lạc giữa các Object.
♦ Quản lý bộ nhớ :
Dữ liệu truyền qua lại giữa các Object không thể là các tham biến bởi vì tham khảo
đến một đòa chỉ vùng nhớ của hệ thống từ xa là một tham khảo không có ý nghóa đối
với một máy tính Local.
♦ Multiple Languages:
Những dòch vụ sử dụng cơ chế đối tượng phân bố và ứng dụng Client của chúng có
thể được viết bằng những ngôn ngữ lập trình khác nhau. Mô hình đối tượng phân bố
thực hiện việc mapping ngôn ngữ.
1
♦ Giao tiếp network :
Khi hiện thực một ứng dụng sử dụng cơ chế Distributed Object thì trong việc giao tiếp
giữa các Object, ta phải đảm bảo sao cho một message được gửi đi thì nó sẽ đến được
người nhận một cách chính xác. Điều này nhằm đảm bảo cho hệ thống hoạt động một
cách ổn đònh chính xác.
♦ Persistence :
Sự giao tiếp với những object thông qua một network cũng đặt ra những vấn đề như
làm thế nào duy trì một tham khảo đến một remote object .
♦ Standardization
Một yêu cầu đối với các cách giải quyết vấn đề của một ứng dụng có sử dụng
Distribited Object là chúng phải chuẩn. Điều này là nhằm mục đích là để cho ứng
dụng được viết ra được chấp nhận bởi nhiều người sử dụng, nhiều hệ thống.

Giải pháp Distributed Object
Xây dựng một mô hình Distributed Object , theo chuẩn phải đáp ứng ít nhất những yêu cầu
sau:
• Hỗ trợ vấn đề platform không đồng nhất.
• Cho phép đònh vò một Object một cách dễ dàng.
• Giải quyết được các vấn đề về quản lý bộ nhớ.
• Hỗ trợ giao tiếp giữa nhiều ngôn ngữ lập trình.
• Quản lý giao tiếp network ở các mức dưới.
• Cung cấp một cơ chế lưu trữ những tham khảo đến một remote object.
• Thỏa mãn những tiêu chuẩn công nghiệp.
Với những hỗ trợ cho cơ chế Distributed Object hiện nay, những vấn đề cơ bản sau đây đã
được giải quyết :
• Cơ chế cho việc quản lý vấn đề giao tiếp giữa những Object với nhau thông qua
các protocol chuẩn như TCP/IP.
• Cơ chế cho việc đònh vò Remote Object.
• Cơ chế cho việc Marshaling và Unmarshaling những dữ liệu truyền qua lại trên
mạng.
• Cơ chế cho việc cung cấp một Interface cho một remote object trong không gian
đòa chỉ cục bộ .
• Các kỹ thuật để có thể tham khảo tới một Remote Object.
Hiện nay, có nhiều giải pháp thông dụng cho mô hình Distributed object, chẳng hạn như:
1
• CORBA ( Common Object Request Broker Architecture) được phát triển bởi
Object Management Group (OMG)
• DCOM (Distributed Component Object Model), được phát triển bởi Microsoft.
• RMI (Remote Method Invocation ), được phát triển bởi Sun.
Mỗi cơ chế có những đặc trưng của nó. Tùy vào tính chất đề tài mà có sự chọn lựa. Ngoài
ra khó có thể có sự so sánh chính xác. Đề tài đang được thực hiện là tìm hiểu một trong
những cơ chế về distributed object ,đó là RMI.
1

Chương 2 : Giới thiệu về RMI
- IVKhái niệm chung
- 1Java RMI (Remote Method Invocation)
RMI là một cơ chế cho phép một Object đang chạy trên một Java Virtual Machine này gọi
một Method của một Object đang tồn tại trên một Java Virtual Machine (JVM) khác. Sun
hiện thực cơ chế này bằng cách xây dựng một hệ thống gọi là hệ thống Java Remote
Method Invocation, hệ thống này cung cấp một số phương pháp truyền thông giữa những
chương trình được viết trong Java. Các chương trình viết trong Java và sử dụng hệ thống
này gọi là những chương trình RMI.
Thực chất, RMI là một cơ chế gọi hàm từ xa đã được hiện thực và tích hợp trong ngôn ngữ
Java, vì vậy RMI cũng phải đối phó với những vấn đề như là RPC đối phó với những đã
xảy ra đối với RPC và các cách giải quyết vấn đề cũng tương tự như RPC . Tuy nhiên,
RMI có nhiều điểm tiện lợi hơn RPC, đó là việc RMI được hiện thực bởi Java, mà Java là
một ngôn ngữ lập trình hướng đối tượng, nên phương pháp lập trình trong RMI là phương
pháp hướng đối tượng, do đó các thao tác hay các lời gọi hàm đều liên quan đến các đối
tượng. Ngoài ra, RMI còn cho phép một Client có thể gửi một Object đến cho Server xử
lý, và Object này cũng có thể được xem là tham số cho lời gọi hàm từ xa, cần chú ý rằng
Object này cũng có những dữ liệu bên trong và các hành vi như một Object thực sự.
- 2Remote Interface, Remote Object, Remote Method
Cũng như tất cả các chương trình khác trong Java, chương trình RMI cũng được xây dựng
bởi các Interface và các Class. Interface đònh nghóa các Method, và các Class hiện thực
các Method đó và có thể là Class còn hiện thực một vài Method khác nhưng chỉ có những
Method khai báo trong Remote Interface mới được Client gọi từ một Java Virtual Machine
khác, hay nói khác đi là chỉ có những Method khai báo trong Remote Interface mới được
nhìn thấy bởi Client.
Vì vậy, Remote Interface là một Interface khai báo các Method cho phép gọi từ xa. Trong
Java, Remote Interface có các đặc điểm :
• Thừa kế Interface có sẵn : Interface java.rmi.Remote
• Mỗi Method trong Remote Interface muốn là Remote Method phải được khai báo
là throws java.rmi.RemoteException và có thể có các Exception khác.

The Remote Object là một Object được tạo ra để cho phép những Object khác trên một
JVM khác gọi tới nó. Remote Object chứa một số các Method, những Method này cho
1
phép gọi từ xa và các Method này sẽ được thực thi bởi JVM gọi là Server. Các Method
này gọi là các Remote Method.
Hình 1. Remote Object, Remote Method.
- 3Name Server
Như trong RPC, Name Server là một Process đóng vai trò trung gian trong việc tìm kiếm
tham khảo tới một Remote Object nào đó, cụ thể là nó giúp Client tìm kiếm một tham
khảo (Reference) tới một Remote Object mà Client đó cần. Trong hệ thống Java RMI,
Name Server có thể là một máy bất kỳ trong hệ thống của chúng ta, Name Server phải có
một vùng nhớ gọi là Name Space dùng để chứa lại tên và đòa chỉ tương ứng của các
Remote Object trong hệ thống.
Hình 2. Name Server.
- 4Stub và Skeleton
Trong RPC, thì một phần không thể thiếu để một Process trên một máy từ xa có thể gọi
thực thi các Remote Method của các Remote Object trên một máy Server nào đó là các
1
chương trình Client Stub và Server Stub (Java RMI gọi là Stub và Skeleton). Để có một
cái nhìn cụ thể hơn, ta sẽ trình bày về nhiệm vụ của Stub và Skeleton.
Những công việc được thực hiện bởi Stub trong Java RMI:
• Tạo một cầu nối với JVM có chứa Remote Object mà Client cần.
• Marshals các tham số cần cho việc gọi hàm và thực hiện việc gửi chúng đi.
• Chờ kết quả trả về từ lời gọi hàm.
• Unmarshals gói dữ liệu nhận được để đọc các giá trò trả về hay các Exception trả
về từ lời gọi hàm.
• Trả kết quả về cho chương trình Client thực sự.
• Ngoài ra, Stub còn đóng một vai trò khác quan trọng, đó là Stub sẽ nắm giữ một
tham khảo tới Remote Object để Remote Object không bò Giải phóng bởi trình
Gabage Collection tự động của Java.

Khi có một lời gọi hàm gửi tới Skeleton, Skeleton sẽ thực hiện các công việc như sau :
• Unmarshals gói dữ liệu nhận được để có những thông tin cần thiết cho việc gọi
hàm.
• Thực hiện lời gọi hàm đối với hệ thống thực thụ.
• Marshals kết quả trả về và gửi trả về cho Client.
Hình 3. Stub – Skeleton.
Với những nhiệm vụ của từng phần như trên, ta cũng có thể thấy vài sự khác nhau về
Client Stub,Server Stub giữa RMI và RPC như sau :
Stub (RMI) so với Client Stub (RPC) :
0. Stub khác với Client Stub ở chỗ là Stub đóng vai trò là
một người nắm giữ một tham khảo tới một Remote Object, điều này giúp cho
Remote Object không bò cơ chế Garbage Collection xóa đi. Trong khi đó, Client
Stub thì không đóng vai trò này.
1
1. Stub còn đóng vai trò quan trọng trong việc Serialize một
Object, và việc truyền khai báo Class cho Skeleton khi có yêu cầu.
Skeleton (RMI) so với Server Stub(RPC) :
2. Server Stub không cần phải thực hiện viện Serialize một
Object và cũng như nó không cần phải yêu cầu hay quan tâm gì đến việc tìm khai
báo một Class nào đó. Trong khi Skeleton thì phải quan tâm đến những điều đó.
- VNguyên tắc hoạt động của Java RMI
Một chương trình RMI thông thường được chia làm 2 phần, đó là chương trình trên Client
và chương trình trên Server.
Nhiệm vụ của chương trình Server là tạo một số các Remote Object và làm cho các tham
khảo tới chúng có thể được tham khảo từ xa, sau đó ngồi chờ Client gọi để thực thi. Sau
khi có lời yêu cầu gì đó Server sẽ thực thi Method đó và trả kết quả về cho Client.
Nhiệm vụ của chương trình Client là tìm kiếm và lấy các tham khảo đến các Remote
Object mà nó cần từ một máy Name Server nào đó, sau đó gọi các Method của Remote
Object đó. Nhiệm vụ của hệ thống Java RMI là cung cấp các kỹ thuật để Server và Client
có thể liên lạc với nhau, cụ thể hơn là các kỹ thuật giúp cho Server và Client có thể

truyền nhận thông tin qua lại với nhau.
- 1Cơ chế hoạt động :
Hoạt động cụ thể của một chương trình RMI chúng ta có thể biểu diễn như sau :
Hình 4. Cơ chế hoạt động của chương trình RMI.
Như hình trên ta có thể thấy cơ chế hoạt động của một chương trình RMI như sau :
1
(1) Trên Server có một số các Remote Object với các Remote Method muốn cho phép gọi
từ xa, thì người viết các Remote Object đó phải bố trí các Stub, Skeleton và các Remote
Interface trên WEB Server sao cho JVM khác có thể truy cập được, cụ thể hơn là Client
hay RMIRegistry có thể truy cập được.
(2) Server đó phải đăng ký với Registry để báo cho các JVM đóng vai trò Client biết là
Server đã sẵn sàng phục vụ.
(3) Registry nhận được lời yêu cầu đăng ký, nó sẽ tự động thực hiện việc Load Stub Class
trên Web Server dựa vào codebase mà Remote Object cung cấp. Việc làm này được thực
hiện một cách tự động nhờ cơ chế Load Class động trong Java, vì vậy thao tác này người
lập trình không phải quan tâm đến mà chỉ cần cung cấp một codebase chính xác để
Registry có thể đi tìm.
Chú ý : Registry sẽ truy cập Stub Class File bằng URL Protocol. Nghóa là Registry chỉ
gửi một yêu cầu truy cập Stub Class File theo URL Protocol đến cho WEB
Server để nhờ WEB Server trả về cho Registry Stub Class File. Một cách rõ
ràng hơn là Registry sẽ không trực tiếp thực hiện việc truy cập Stub Class
File trên một JVM khác.
(1) (4) Khi Client cần gọi thực thi một Remote Method nào đó, Client phải gửi một
Message đi hỏi Registry để có được tham khảo tới Remote Object mà nó cần.
(2) (5) Sau khi đã có tham khảo tới Remote Object cần thiết rồi, Client sẽ tự động thực
hiện việc Load Stub Class theo cơ chế Load Class động trong Java.
(3) (6) Client gửi yêu cầu thực thi một Method nào đó mà nó cần với đầy đủ các tham số
cần thiết.
Các đường không liên tục là biểu diễn cho các bước mà người lập trình không nhìn thấy
được do Java đã tự động làm.

Có một điều chúng ta cần chú ý ở đây là ta phải bố trí bytecode của Stub và Skeleton sao
cho một JVM từ xa có thể truy cập tới được. Vì theo nguyên tắc, thì một chương trình trên
một JVM không thể tự nó truy cập vào một file nào đó trong hệ thống file của một JVM từ
xa, bởi vì một lý do đơn giản là Local JVM không biết JVM từ xa tổ chức hệ thống file
của nó như thế nào. Vì vậy, khi chương trình trên một JVM muốn truy cập thông tin trên
một file nào đó trên một JVM từ xa thì đầu tiên nó phải có quyền truy cập file đó, sau đó
nó phải gửi tới một chương trình trên JVM từ xa một yêu cầu truy cập file, nhờ chương
trình đó truy cập và trả kết quả truy cập về cho nó.
- 2Các công việc đã giải quyết được
Thông thường thì một chương trình dùng RMI còn được gọi là một Distributed Object
Application. Do đó, với cơ chế hoạt động như trên thì cơ chế RMI đã giải quyết được
những công việc phải thực hiện trong một Distributed Object Application :
1
. a Đònh vò Remote Object
Vì đây là một chương trình chạy trên nhiều máy, do đó để hợp tác với nhau làm việc thì
các Object phải gửi nhận thông tin qua lại với nhau, vì vậy một Distributed Object
Application cần phải giải quyết được việc đònh vò các Remote Object nhằm phục vụ cho
việc truyền nhận thông tin như đã nói. Về mặt này có hai kỹ thuật để thực hiện là : hỏi
trực tiếp máy có chứa Remote Object tham khảo tới Remote Object hỏi cho đến khi nào
có được tham khảo cần thiết, cách thứ hai là dùng cơ chế Naming. Bình thường thì trong
RMI dùng cơ chế Naming.
♦ Cơ chế Naming
Client có thể gọi những method trên những Remote Object khi và chỉ khi chúng lấy được
tham khảo đến Object đó. RMI cung cấp một Name Server đơn giản. Những Remote
Object đăng ký với Naming sử dụng class java.rmi.NamingRegistry . Lớp này sử dụng cơ
chế Naming dựa trên một URL.
Hình 5 .Remote Object đăng ký với Naming Registry
Client sử dụng class java.rmi.Naming tìm kiếm (look up) và nhận được một tham
khảo đến những Object. Đòa chỉ của Remote Object được xác đònh với một URL chỉ
đến máy từ xa và tên của object trên máy đó. Khi một object đăng ký với registry, nó

có một tên gợi nhớ. Những client từ xa sẽ tham khảo đến các Object này bằng tên
này.
Hinh 6. Naming Service
. b Vấn đề truyền tham số trong lời gọi hàm
Trong Java RMI, tham số cho lời gọi hàm hay giá trò trả về từ lời gọi hàm đều có thể là
một Object nào đó, với điều kiệu Object đó có thể “Serialize” được. Ở đây ta xét đến việc
1
Naming
bind()
Naming Reg istry
name
Remote Object
name
Naming Reg istry
Remote Object
Server
rmi://server/name
Client
Remote
reference
truyền nhận cụ thể trong Java là thực chất là truyền cái gì, khi một Object nào đó được gọi
là truyền đi.
♦ Truyền Non-Remote Object :
Khi một Non-Remote Object được truyền đi, thực chất là Object đó được Copy thành
một Object mới sau đó nó được Serialize rồi được truyền đi cho người nhận. Vì vậy,
Non-Remote Object là một tham số nó sẽ được Copy từ một Object có sẵn và bên
nhận sẽ khôi phục lại Object đó từ chuỗi các Byte, còn nếu Non-Remote Object là
giá trò trả về nó sẽ được tạo mới và truyền đi.
Hình 7. Truyền Non-Remote Object.
♦ Truyền Remote Object :

Khi một Remote Object cần truyền đi thì thực chất là Stub được truyền đi. Không một
Remote Object nào được truyền đi vì với mỗi Object được gọi là Remote Object là
nhờ nó đã đăng ký với Name Server nên khi bò truyền đi thì việc đăng ký không còn
ý nghóa.
Hình 8. Truyền Remote Object.
♦ Sự tích hợp các tham khảo :
Khi có hai tham khảo tới cùng một Object được truyền đi thì thực chất Object đó chỉ
được Copy lại một lần và hai tham khảo đó sẽ chỉ cùng Object khi Object đó được
khôi phục ở bên nhận.
1
. c Truyền nhận thông tin với Remote Objects
Chi tiết về việc truyền nhận như thế nào thì RMI đã làm, đối với người sử dụng thì việc
truyền thông với Remote Object giống như là việc truyền thông với những Object bình
thường khác.
. d Lấy ByteCodes của một Class mà Object của nó được truyền
Bởi vì RMI cho phép truyền nhận các Object, mà các Object này “Serialize” được, vì vậy
một Distributed Object Application cũng phải giải quyết việc lấy ByteCodes về để có thể
thực thi tiếp công việc nào đó. RMI đã cung cấp cho ta những kỹ thuật cần thiết để lấy
ByteCodes của một Object cũng như Java đã cung cấp cho ta những kỹ thuật truyền nhận
dữ liệu của các Object này vậy.
- VIMột số đặc điểm nổi bật của Java RMI
RMI là cơ chế gọi hàm từ xa, vì vậy những vấn đề căn bản trong cơ chế này như giải
quyết vấn đề truyền tham số trong lời gọi hàm như thế nào, vấn đề đònh vò Remote Object
ra sao là những vấn đề quan trọng.
Ở đây ta quan tâm đến một số đặc điểm nổi bật của Java RMI. Java RMI có một số đặc
điểm nổi bật như:
• Dynamic Class Loading(Cho phép Load Class động).
• Thread usage in RMI(Cho phép sử dụng Thread trong RMI).
• Gabage Collection of Remote Object (Tự động giải phóng các Remote Object mà
hệ thống không còn tham khảo tới).

Các đặc điểm này sẽ được trình bày một cách rõ ràng hơn trong các phần sau .
Tóm tắt
Tóm lại, cơ chế RMI trong Java là một cơ chế cho phép gọi hàm từ xa. Cơ chế này
giải quyết việc đònh vò Remote Object bằng cơ chế Name Server như đã nêu trên. Về
nguyên tắc hoạt động thì nhìn chung có 6 bước nhưng Java đã đảm nhận cho ta một
phần và người lập trình chỉ còn phải thực hiện 3 bước mà thôi.
Thêm vào đó là RMI có những đặc điểm chính yếu là : cho phép sử dụng Thread
trong RMI, RMI có hỗ trợ cơ chế dọn rác và RMI có hỗ trợ việc Load Class động. Với
đặc điểm cuối cùng này, RMI cho phép Client có thể gửi một Object lên cho Server
thực thi hộ một vài Method. Điều này lợi thế hơn hẳn so với các hiện thực cho việc
gọi hàm từ xa đã có trước đây.
1
Chương 3 : Một số kỹ thuật liên quan
- VIIDynamic Class Loading
Java RMI khác với RPC là nó cho phép các giá trò trả về hay các tham số truyền cho hàm
là một Object thực thụ, Object với những dữ liệu và các hành vi như đã khai báo Object
đó. RMI sử dụng kỹ thuật Serialization một Object để gửi nhận Object giữa các Java
Virtual Machine(JVM) với nhau. Và cũng nhờ kỹ thuật này Java cũng cho phép Load
Class động.
Ta nói Java cho phép người sử dụng có thể Load Class động, vậy Load Class động là như
thế nào ? Load Class động có ưu điểm gì ? Phần trình bày sau đây sẽ trả lời các câu hỏi
này.
- 1Ví dụ về Load Class động
Với ý tưởng về RPC, trên thực tế đã có nhiều hiện thực của ý tưởng này. Ví dụ như Sun
RPC, Xerox Courier,…nhưng hầu hết các hiện thực đó việc Load Class động không được
đề cập đến. Khi một hàm cho phép gọi từ xa được biên dòch trên Server, các Client Stub
và Server Stub được tạo ra và vì vậy đối với Client Stub thì nó chỉ phục vụ cho Client
những hàm đã có khai báo trong Client Stub bởi Server, hơn thế nữa là Client Stub chỉ
phục vụ những hàm với các kiểu dữ liệu của tham số và kiểu dữ liệu của trò trả về là một
kiểu nhất đònh nào đó không thể thay đổi được nữa.

Ví dụ : Trên Server ta khai báo hàm như sau :
int Example ( ClassNameA a, float b); (Với ClassNameA là tên một Class)
Thì trên Client khi gọi hàm Client phải truyền các tham số cụ thể là :
ClassNameA ObjA;
float num;
int result = Example ( ObjA,num)
Ta có thể dễ dàng thấy rằng với RPC không cho Load Class động thì một khai báo
hàm cho phép gọi từ xa sẽ được gắn liền với một Stub nào đó. Nếu ta gọi một hàm khác đi
(mới so với các hàm đã khai báo), hay gọi hàm đó với kiểu dữ liệu tương đương của các
tham số hay các trò trả về, thì các Stub sẽ không thực hiện được công việc dù trên nguyên
tắc Logic chúng vẫn có thể thi hành được.
Ví dụ : Với khai báo hàm trên Server của ví dụ trên, nếu trên Client ta gọi hàm khác đi
như sau :
1
ClassNameB ObjB;
float num;
int result = Example (ObjB,num);
hay có thể ta chỉ thay đổi cách gọi hàm giống như sau :
ClassNameA ObjA;
int num;
int result = Example (ObjA,num);
Với ClassNameB là một Class tương đương với ClassNameA nghóa là những gì
ClassNameA làm được thì ClassNameB cũng làm được hay về mặt lý luận trên thực tế
một số nguyên cũng có thể xem là một số thực, do đó theo lý luận trên ta có thể truyền
một số int thay cho một số float. Nhưng với cơ chế Load Class bình thường mà Sun RPC
hay Xerox Courier cung cấp thì cách gọi hàm này không chấp nhận được, cụ thể là Client
Stub không hiểu và không phục vụ cho Client.
Với ví dụ trên, nếu muốn gọi hàm trên với tham số là một Object thuộc ClassNameB, thì
những công việc cần làm là phải sửa đổi khai báo hàm trên Server và hợp dòch lại để có
được một Client Stub mới. Điều này gây ảnh hưởng về tính uyển chuyển của việc lập trình

và chạy chương trình bởi vì dễ thấy rằng nếu muốn truyền các giá trò trả về hay các tham
số cho một hàm từ xa nào đó, mà các giá trò này thuộc kiểu dữ liệu khác với khai báo hàm
thì ta phải thực hiện biên dòch lại chương trình tại Server.
Trên đây là một ví dụ cụ thể đối với Remote Method. Qua đó ta cũng có thể phần nào
thấy được việc Load Class động là như thế nào !
- 2Load Class động là gì ?
Java đã cung cấp cho ta một cách để khắc phục được yếu điểm không uyển chuyển đã
trình bày ở ví dụ trên, đó là Java cho phép Load Class động.
Load Class động là một cơ chế sẽ được Java thực hiện nếu như trong lúc thực thi chương
trình mà Java phải tham khảo đến một Object thuộc một Class A mới nào đó mà JVM
hiện tại chưa có đònh nghóa của Class A này thì Java sẽ tự đi load Bytecodes của A và tạo
mới một Instance của A để công việc được tiếp tục. Từ đó, ta dễ thấy rằng việc tìm kiếm
Bytecode Class mới của JVM phải do người lập trình chỉ đònh để chương trình có thể chạy
một cách chính xác. Do đó, Java cho phép người lập trình có thể chỉ đònh nơi tìm kiếm các
Bytecode này thông qua CLASSPATH và codebase. Chúng ta sẽ xem xét sau về phần
này.
1
Hình 9. ClassA là một Class mới đối với Server.
Java RMI cũng cho phép việc Load Class động, nghóa là trong các gói dữ liệu truyền qua
lại giữa Client và Server có một vùng thông tin để chứa lại thông tin đặc tả Class A nào
đó mà Object của A đó được truyền đi trong gói dữ liệu tương ứng. Điều này giúp Java có
thể xác đònh xem có cần phải đi Load Bytecode để phục vụ cho mục đích tạo lại Object từ
dữ liệu nhận được hay không ?
Chú ý là chỉ đối với những Object mới được thực hiện điều này, với kiểu dữ liệu nguyên
thủy (ví dụ: kiểu int, float …) thì do Java không hỗ trợ việc tự động chuyển đổi kiểu nên
RMI cũng không hỗ trợ việc chuyển đổi kiểu trong việc gọi hàm từ xa.
Điều này có nghóa là khi có một khai báo hàm tại Server và hàm này có các giá trò trả về
hay các tham số là Object của một Class A nào đó, thì khi gọi hàm hay khi trả kết quả về
thì ta có thể thay Object thuộc chính xác Class A đó bằng một Object thuộc Class B, với
điều kiện là Class A và Class B là hai Class tương đương nhau. Đây chính là ưu điểm của

việc Load Class động trong Java. Ta cũng có thể hiểu rằng điều này có được là do cách
Java truyền những gói dữ liệu giữa Client và Server.
- 3Lợi điểm của việc Load Class động:
Lợi điểm của việc Load Class động là nó cho phép chương trình chạy uyển chuyển hơn.
Cụ thể là khi khai báo Remote Method với các kiểu của tham số là các Object thuộc Class
nào đó, mà khi ta truyền một Object thuộc Class khác nhưng tương đương và Object này
có các hành vi thực hiện những công việc khác đi hay thực hiện công việc đó tốt hơn, thì
Java RMI vẫn chấp nhận và vẫn có thể thực thi công việc một cách chính xác.
- 4Ứng dụng cụ thể của Load Class động :
Trong cơ chế hoạt động của RMI trình bày ở trên, ở bước thứ (3) sau khi Server đăng ký
với Registry, thì Registry phải có một tham khảo tới một Object thuộc Stub Class với Class
này là Class mà Registry chưa có bất kỳ thông tin gì về Class đó. Vì vậy, lúc này Registry
phải thực hiện việc Load Class động đối với Stub Class.
Trong RMI, người ta còn cho phép Client có thể gửi lên cho Server một Object để nhờ
Server thực thi hộ hành vi của Object đó. Do đó, khi Client gửi lên một Object mà Server
1
chưa có, thì việc Load Class động lại được thực hiện để Server có thể tiếp tục công việc
một cách liên tục.
- VIIISerialization
Đối với lập trình hướng đối tượng, các Object là một chủ thể chính yếu của một hệ thống.
Và trong Distributed Application, các thành phần của Application đó có thể gửi qua lại cho
nhau những Object thông qua Network. Điều đó có nghóa là ta phải tìm một phương pháp
nào đó để có thể chuyển một Object trong bộ nhớ tại host này thành một chuỗi các byte(s)
để có thể truyền trên network. Một trường hợp khác, khi ta cần phải lưu hệ thống các
Object đang hoạt động xuống phương tiện lưu trữ để phục vụ một mục đích nào đó, thì
ngay lúc ấy ta có một nhu cầu là phải biểu diễn một Object với đầy đủ các trạng thái và
các mối quan hệ với các Object khác trong bộ nhớ thành một chuỗi các Bytes nhớ. Nói
tóm lại, nhu cầu về việc biểu diễn một Object thành các byte nhớ là một nhu cầu thiết yếu
trong lập trình hướng đến đối tượng.
Object Serialization là việc biểu diễn một Object bằng một số Byte về mặt vật lý và sau

đó, khi cần ta có thể khôi phục lại Object đó bằng các Byte biểu diễn đối tượng đó, với tất
cả các dữ liệu và hành vi giống như Object trước đó. Công việc chuyển đổi một Object
trong bộ nhớ thành một chuỗi các Byte vật lý gọi là Serialize một Object.
Hình 10. Serialization
Việc lưu trữ và phục hồi những object không đơn giản như việc lưu trữ là phục hồi các
kiểu dữ liệu nguyên thủy. Không phải chỉ lưu object bằng cách ghi các byte biểu diễn
Object đó xuống, và khi phục hồi một object cũng vậy. Những Object được lưu trữ (store)
và phục hồi (retrieved) thường xuyên tham khảo đến những object khác. Trong khi đó
việc lưu chứa một Object trong bộ nhớ thì dễ dàng nhờ trong bộ nhớ việc biểu diễn các
mối liên hệ giữa các Object dễ dàng, nhưng khi lưu Object đó xuống dóa thì khó có thể
biểu diễn được các mối liên hệ đó, và khi khôi phục lại Object đó trong bộ nhớ thì việc
tạo lại mối liên hệ giữa các Object là một vấn đề, vì một lý do đơn giản là không chắc lúc
nào ta cũng tạo được các Object tại các đòa chỉ trong bộ nhớ mà chúng giống như vò trí
của Object trước đó. Do đó, cần có một cơ chế để quản lý vấn đề này, làm sao để lưu trữ
và lấy những object lên mà vẫn đảm bảo chính xác những tính chất , trạng thái , duy trì
được những quan hệ giữa những đối tượng . Serialization là một cơ chế thực hiện công
việc này.
1
Vấn đề Serialization cũng được đặt ra khi truyền một Object từ JVM này đến JVM khác,
đó là do khi truyền một Object ta phải truyền thành một chuỗi các Byte, rồi sau đó ta cũng
phải khôi phục lại Object đó dựa trên các Byte này.
Vì vậy, vấn đề Object Serialization cũng là một vấn đề cần quan tâm trong RMI. Trong
Java, người ta đã cung cấp cho chúng ta một số các Interface tên là Serializable Interface
và Externalizable Interface, nhằm phục vụ cho mục đích Serialize một Object. Do đó, nếu
ta khai báo một Interface extends từ java.io.Serializable thì những Object nào implements
từ Interface này đều là những Object có khả năng Serialize, lúc đó ta gọi Object đó là
Seriaizable Object.
Đối với những Java Object, cách Serialized một Object là phải xác đònh và những đònh
nghóa lớp cho Object phải được kiểm tra bởi Java, để từ đó nội dung của Object được store
một cách chính xác và việc restore nội dung thành một instance mới được thực hiện một

cách chính xác. Đối với serializable objects, stream bao gồm những thông tin đủ để
restore những field trong stream thành một Object tương thích của lớp đó.
Objects được lưu trữ và phục hồi thường xuyên tham khảo (refer) đến những object
khác. Những object này phải được lưu và phục hồi tại cùng một thời điểm để duy trì được
những quan hệ chính xác giữa những đối tượng. Khi một object được lưu trữ, những object
mà object này tham khảo đến cũng được lưu trữ.
Tiêu chí của Serializing Java Objects là :
♦ Đưa ra một cơ chế đơn giản mà vẫn có thể mở rộng.
♦ Có thể mở rộng để hỗ trợ marshaling và unmarshaling khi cần thiết cho những
Remote Object.
♦ Có thể mở rộng (extensible) để hỗ trợ tính persistence của Java objects.
Object Serialization đưa ra và sử dụng một dòng những byte gồm một hay nhiều primitives
và những object. Những object được ghi xuống stream ,tham khảo đến những object khác
cũng được biểu diễn dưới những stream. Object Serialization chỉ đưa ra một format stream
giải mã và lưu trữ những contained objects. Object Serialization được thiết kế để cung cấp
nhiều đặc tính cho những lớp Java. Những container format khác như OLE hay OpenDoc
biểu diễn hệ thống file và stream khác nhau.
Mỗi object hoạt động như một container hiện thực một interface cho phép primitives đó
và objects được lưu trữ vào nó hoặc được khôi phục từ nó.
Mỗi object được lưu xuống stream phải cho phép chính nó được lưu và phải hiện thực
những protocol cần thiết để lưu (save) và phục hồi trạng thái của nó. Những protocols
này cho phép container yêu cầu object ghi và đọc trạng thái của nó . Khi được lưu trong
một Object Stream, mỗi object phải hiện thực Interface Serializable hoặc Externalizable.
1
Đối với lớp hiện thực Interface Serializable, việc Object Serialization có thể tự động save
và restore những field của mỗi class của một object và tự động quản lý những lớp bằng
cách thêm vào những field hay supertypes. Một lớp Serializable cũng có thể khai báo
những field của nó là transient (nghóa là không cần lưu trữ lại và không cần làm thao tác
phục hồi khi phục hồi Object đối với field đó).
Đối với lớp Externalizable , Object Serialization giao cho những lớp toàn quyền điều

khiển qua external format và trạng thái của supertype được save và restore như thế vào.
Trong việc xây dựng ứng dụng phân bố sử dụng RMI, vấn đề Serialization luôn được
quan tâm vì có việc truyền các Object xảy ra.
- IXMultiThread
- 1Khái niệm MultiThread
Có thể nói Process ( Quá trình ) là một chương trình đang chạy. Trong một hệ thống, đối
với một Process để nó có thể thực thi được, thì nó cần được hệ thống cung cấp một vùng
nhớ để chứa lại các thông tin quản lý Process, vùng nhớ để chứa mã lệnh của chương
trình, vùng nhớ để chứa dữ liệu của chương trình, một vùng Stack và quan trọng là một
dòng xử lý (Thread). Dòng xử lý là dòng điều khiển CPU để xử lý công việc nào đó, trong
một dòng điều khiển cụ thể sẽ có một số câu lệnh được thực thi một cách tuần tự nhằm
mục đích thi hành một việc gì đó. Vì vậy, một Process ít nhất phải có một Thread để có
thể làm việc được. Và có thể có nhiều Thread thực hiện một số công việc độc lập nào đó.
Một chương trình Multithread là một chương trình ở cùng thời điểm có nhiều Thread cùng
chạy, có nghóa là tồn tại nhiều tập những dãy lệnh tuần tự (Instruction Sequence) được
thực thi đồng thời. Mỗi Instruction Sequence có một dòng điều khiển độc lập với những
dòng khác.
Phân biệt Multiprocess và Multithread
Multiprocess cung cấp sự đồng thời giữa các process. Mỗi Process được cấp vùng không
gian đòa chỉ riêng, có các tài nguyên riêng.
Hình 11 Phân biệt MultiThread và MultiProcess.
1
Multithread cung cấp sự đồng thời trong ngữ cảnh của một Process. Multithread chia sẻ
dòng điều khiển trong một Process. Những Thread trong một chương trình MultiThread
được thực thi trên cùng một vùng dữ liệu chung, chính là vùng dữ liệu của hệ thống cấp
cho Process. Nếu có một biến global nào đó thay đổi trong một Thread nào đó thì tất cả
các Thread khác cũng bò thay đổi. Nói tóm lại, các Thread dùng chung tài nguyên và
cùng không gian đòa chỉ.
Lợi điểm của Thread
• Thread mất ít thời gian để tạo và loại bỏ so với việc tạo và loại bỏ Process.

• Multithread tốn ít thời gian chuyển đổi ngữ cảnh.
• Tiết kiệm tài nguyên.
Vì vậy, Multithread có nhiều ưu điểm hơn so với Multiprocess. Vì lý do đó mà các ngôn
ngữ lập trình hiện đại đều có hỗ trợ Multithread, Java cũng vậy.
- 2Lập trình Multithread trong Java
Java hỗ trợ cả Multiprocess và Multithread. Multithread không phụ thuộc platform.
Lập trình Multithread cũng giống như Single Thread, chỉ khác là nó thực hiện đồng thời
nhiều tập những lệnh có trình tự (Intruction Sequence), mỗi Instruction Sequence đó có
dòng điều khiển riêng, độc lập với những Intruction Sequence khác. Những Instruction
Sequence thực hiện một cách độc lập đó gọi là Thread.
Hệ thống có bộ đơn xử lý chỉ hỗ trợ tính đồng thời về mặt Logic (Logical Concurrency).
Đặc điểm quan trọng của lập trình Multithread trong Java là hỗ trợ tính tuần tự về mặt
Logic (Logical Sequence).
Multithreading của Java tập trung ở lớp java.lang.Thread. Lớp Thread cung cấp khả
năng tạo ra những đối tượng của lớp Thread. Lớp Thread đóng gói dữ liệu và các phương
thức kết hợp với các thread khác nhau và cho phép Multithreading tích hợp trong một
framework hướng đối tượng.
Java cung cấp 2 cách để tạo ra thread. Đó là cách tạo ra các Object extend ngay từ lớp
java.lang.Thread, và cách thứ hai là implement một Interface do Java cung cấp đó là
Interface Runable (Tài liệu tham khảo : Java Developer’ s Guide[6]).
- 3Các trạng thái của Thread
♦ New:
Khi tạo ra một thread với new, không có code bên trong thread . Chúng xác đònh bộ
nhớ cần thiết cho thao tác start.
♦ Runable:
Một khi gọi hàm start, thread ở trạng thái runable.
♦ Blocked:
1
Một thread rơi vào trạng thái blocked khi một trong bốn action sau đây xuất hiện:
• Hàm sleep () được gọi trong thread.

• Hàm suspend() được gọi
• Thread gọi hàm wait
• Thread gọi một thao tác input/output.
♦ Dead:
Một thread dead bởi một trong hai lý do sau:
• Nó dead vì run method exit
• Nó bò kill bởi hàm stop() được gọi.
- 4Garbage collector thread
Java cung cấp Garbage Collector Thread để giải phóng một cách tự động và đònh vò
lại bộ nhớ động (dynamically allocated memory).
Bộ thu dọn rác của Java chạy như một thread có độ ưu tiên thấp, khi Java xác đònh
không có một tham khảo nào đến đối tượng điều khiển Thread nhất đònh nào đó nữa,
nó đánh dấu đối tượng đó. Garbage collector thread chạy khi hệ thống cho phép
(processor time available) và không có một Runable thread có độ ưu tiên cao hơn.
Tuy nhiên, garbage collector thread sẽ chạy ngay tức thì khi hệ thống hết bộ nhớ để
cung cấp cho chương trình khác(out of memory).
Cơ chế Garbage Collection của Java không phải là một cơ chế quản lý bộ nhớ động
hiệu quả, nhưng nó là một cơ chế nhằm mục đích an toàn cho người lập trình.
- 5Thread Synchronization
Một thread đang chạy có thể truy cập bất cứ đối tượng nào mà nó có một reference
đến. Điều gì xảy ra khi hai thread cùng truy cập một đối tượng, và mỗi thread gọi
một method mà nó modify trạng thái của object đó . Synchronization giải quyết vấn
đề này.
Java dùng monitor để thao tác đồng bộ . Mọi đối tượng với method synchoniation là
một monitor. Monitor chỉ cho phép tại một thời điểm chỉ có một thread thực hiện một
method synchronization trên đối tượng. Nếu có nhiều phương thức synchonization thì
chỉ có một method active còn các method còn lại phải chờ. Điều này được thực hiện
bởi việc locking đối tượng đó khi có một phương thức synchronization đang active.
Khi method đó hòan thành, lock sẽ được giải phóng và thread nào ở trạng thái ready
có độ ưu tiên cao nhất sẽ được tiếp tục .

1
- 6Daemon Thread
Daemon Thread là thread phục vụ cho những thread khác . Daemon thread chạy
Background. Không như những thrread thông thường, daemon thread không ngăn một
chương trình từ Terminating. Garbage collection là một daemon thread.
Nếu một thread là daemon nó phải được set trước khi method star được gọi. Set một
thread như một daemon : setDaemon(true)
Tóm lại, Multithread là một cơ chế quan trọng trong ngôn ngữ Java. Multithreading
có ý nghóa lớn trong việc điều khiển sự thực thi chương trình. Đặc biệt với ứng dụng
sử dụng RMI thì Multithread là cơ chế rất cần thiết.
- XClasspath - Codebase
- 1Giới thiệu
Java RMI cho phép ta load Class động, nghóa là trong lúc gọi hàm từ xa nói riêng và
thực thi chương trình nói chung nếu có tham khảo tới một lớp mới mà JVM chưa có
đònh nghóa của lớp này thì Java sẽ tự đi load Class này để công việc được tiếp tục. Do
đó, việc tìm kiếm Class mới của JVM phải do người lập trình chỉ đònh để chương trình
có thể chạy một cách chính xác.
Java cho phép người lập trình chỉ đònh bằng cách đònh trò cho các biến môi trường do
Java quy đònh trước. Một số biến môi trường có thể liệt kê ra như sau :
• Classpath
• java.rmi.server.codebase.
- 2Classpath
Là một biến môi trường chứa đường dẫn để Java có thể tìm thấy các Class mà chương
trình Java cần trong lúc đang chạy. Ở đây, ta nói “đường dẫn” nghóa là một đường
dẫn tại máy đang chạy chương trình Java, nói cách khác là đường dẫn tại JVM (Java
Virtual Machine) đang chạy chương trình.
Với Windows chúng ta có thể có 2 cách để cài đặt giá trò cho biến môi trường này.
Ta có thể liệt kê ra như sau :
• Cung cấp Classpath cho trình biên dòch và thông dòch ngay lúc chạy, để khi cần
tham khảo tới một Class, các chương trình này có thể tìm kiếm theo Classpath đó.

Cú pháp cho cách này như sau :
Javac -classpath <đøng dẫn> JavaFile.java
Java -classpath <đường dẫn> JavaFile
1
• Tạo lập một biến môi trường để có thể dùng cho cả phiên làm việc. Cú pháp cho
cách này như sau :
Set CLASSPATH = <đường dẫn> ;
Javac JavaFile.java
Java JavaFile
Với Unix ta cũng có các cách set Classpath tương tự như trên nhưng với cú pháp khác
đi. Cụ thể cho việc này chúng ta có thể sẽ trình bày sau.
- 3URL
Để hiểu về codebase thì đầu tiên ta sẽ trình bày một cách sơ lược về URL.
URL là viết tắt của Uniform Resource Locator, có thể nói URL là một “đường dẫn”
của một file hay Directory trên mạng. URL dùng để chỉ đến một vò trí xác đònh trên
mạng.
Có 5 loại URL : file, http, gopher, news, partials.
Cú pháp chung của một URL là :
<protocol>://<đòa chỉ máy>:<port>/<đường dẫn resource>/<tên resource>
♦ File URL :
Áp dụng cú pháp chung trên thì file URL chỉ tới file foobar.txt trong thư mục
pub/files/ trên máy file Server tên là “ftp.yoyodyne.com”:
file://ftp.yoyodyne.com/pub/files/foobar.txt
tương tự ta có file URL chỉ tới thư mục "pub" trên máy FTP Server :
file://ftp.yoyodyne.com/pub
♦ Http URL :
Ví dụ :
/>:1234/pub/files/foobar.html
♦ Gopher URL :
Ví dụ :

gopher://gopher.yoyodyne.com/
gopher://gopher.banzai.edu:1234/
♦ News URL :
1
Không giống như những URL khác, để chỉ tới 1newsgroup tên là "rec.gardening" thì
news URL là:
news:rec.gardening
♦ Partials URL :
Đây là một loại URL dùng để chỉ tới một resource có cùng thư mục, cùng tên máy
với một resource đã có sẵn. Ví dụ : http URL chỉ tới 1 file như sau :
/>Vậy thì lúc này chúng ta có thể dùng partial URL, hay relative URL để chỉ tới một
file khác trong cùng một thư mục, cùng một máy với file tên là “afile.html” như trên.
Ví dụ: trong thư mục trên có file tên là "anotherfile.html", thì lúc này partial URL để
chỉ tới file trên là :
anotherfile.html
- 4Codebase
. a Codebase là gì ?
Codebase là một property do Java đònh nghóa, giá trò của nó là một URL (Uniform
Resource Locator) chỉ tới một nơi chứa Bytecode của những Class mà chương trình có
thể cần tới. Ở đây, giá trò của codebae là một URL có nghóa là Bytecode của Class A
nào đó có thể ở đâu đó trên mạng, và codebase là công cụ giúp cho người lập trình
chỉ đến vò trí của Bytecode đó.
. b Codebase hoạt động như thế nào ?
• Codebase sử dụng trong Applet :
Hình 12. Nguyên tắc hoạt động Load Class đối với Applet.
<applet height=100 width=100 codebase="myclasses/" code="My.class">
<param name="ticker">
</applet>
Giải thích :
1

×