Xem mẫu
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
Giới thiệu công nghệ Java
Java là một công nghệ xây dựng các ứng dụng phần mềm có vị trí rất
lớn trong những năm cuối thế kỉ 20, đầu thế kỉ 21. Nó được coi là công nghệ
mang tính cách mạng và khả thi nhất trong việc tạo ra các ứng dụng có khả
năng chạy thống nhất trên nhiều nền tảng mà chỉ cần biên dịch một lần.
Lần đầu tiên xuất hiện vào năm 1992 như là một ngôn ngữ dùng trong
nội bộ tập đoàn Sun Microsystems để xây dựng ứng dụng điều khiển các bộ
xử lý bên trong máy điện thoại cầm tay, lò vi sóng, các thiết bị điện tử dân
dụng khác. Không chỉ là một ngôn ngữ, Java còn là một nền tảng phát triển và
triển khai ứng dụng trong đó máy ảo Java, bộ thông dịch có vai trò trung tâm.
Sun, công ty đã phát minh ra ngôn ngữ Java, chính thức ban hành bản Java
Development Kit 1.0 vào năm 1996 hoàn toàn miễn phíđể các nhà phát triển có
thể tải về, học Java, xây dựng các ứng dụng Java và triển khai chúng trên các
hệ điều hành có hỗ trợ Java. Ban đầu, Java chủ yếu dùng để phát triển
các applet, các ứng dụng nhúng vào trình duyệt, góp phần làm sinh động các
trang web tĩnh vốn hết sức tẻ nhạt hồi dó. Tuy nhiên, cùng với sự phát triển
của công nghệ thông tin và nhu cầu của xã hội, Java applet đã dần mất đi vị trí
của nó và thay vào đó, các công ty, cộng đồng ủng hộ Java đã phát triển nó theo
một hướng khác. Hiện nay, công nghệ Java được chia làm ba bộ phận:
J2SE
Gồm các đặc tả, công cụ, API của nhân Java giúp phát triển các ứng
dụng trên desktop và định nghĩa các phần thuộc nhân của Java.
J2EE
Gồm các đặc tả, công cụ, API mở rộng J2SE để phát triển các ứng dụng
qui mô xí nghiệp, chủ yếu để chạy trên máy chủ (server). Bộ phận hay
được nhắc đến nhất của công nghệ này là công nghệ Servlet/JSP: sử
dụng Java để làm các ứng dụng web.
1
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
J2ME
Gồm các đặc tả, công cụ, API mở rộng để phát triển các ứng dụng Java
chạy trên điện thoại di động, thẻ thông minh, thiết bị điện tử cầm tay,
robot và những ứng dụng điện tử khác.
Java đã trải qua 3 bước phát triển quan trọng: Java 1.0 gắn liền với bản
JDK đầu tiên, Java 2 gắn với JDK 1.2 và Java 5 gắn với J2SDK 1.5 .
Ngày nay, khi nhắc đến Java người ta không còn chỉ nhắc đến Java như
là một ngôn ngữ mà nhắc đến Java như là một công nghệ hay một nền tảng
phát triển. Nó bao gồm các bộ phận:
• Máy ảo Java: JVM
• Bộ công cụ phát triển: J2SDK
• Các đặc tả chi tiết kĩ thuật (specifications)
• Ngôn ngữ lập trình (programming language)
Java có thể xây dựng được mọi loại ứng dụng, Chi xin giới thiệu một
số ứng dụng điển hình trong Java.
1.Ứng dụng Console.
Các ứng dụng Console thường ghi kết xuất ra màn hình văn bản (text
mode) ở chế độ ký tự. Các ứng dụng Console thường bắt đầu bằng lời gọi đến
phương thức main( ).
Ví dụ:
public class ConsoleApp
{
public static void main( String [] args )
{
System.out.println(“ This is console application ”);
}
}
2
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
2.Ứng dụng Graphics
Một chương trình đồ họa thường cần một khung cửa sổ cùng các thành
phần giao diện như nút bấm( button), checkbox, menu... Chương trình đồ họa
còn cho phép bạn vẽ ra cửa sổ bằng Graphics. Graphics là đối tượng đồ họa
dùng để vẽ.Để sử dụng các đối tượng đồ họa cần phải thêm gói thư viện
java.awt.*. Lớp chương trình chính vẫn dùng hàm main ( ) là nơi khởi đầu của
chương trình. Trong hàm main ( ) chúng ta tạo ra đối tượng cửa sổ AppFrame.
Lớp đối tượng này do ta cài đặt phương thức từ lớp Frame.
1) TỒNG QUAN VỂ RMI
Trong một ứng dụng không phân tán của java, đoạn mã trong một đối
tượng có thể gọi phương thức của một đối tượng khác và máy ảo Java phân
giải địa chỉ và truyền tham số từ đối tượng gọi đến phương thức được gọi,
ngoài ra nó cũng trả về các giá trị cho đối tượng gọi thực thi phương thức.
Trong ứng dụng phân tán, mặc dù đoạn mã lập trình phương thức trông
có vẻ giống như trong trường hợp ứng dụng không phân tán, nhưng là một cơ
chế hoàn toàn khác nhau được dùng để móc những đối tượng này. Khi một đối
tượng muốn gọi một phương thức, nó sẽ gọi một đối tượng bè bạn bên phía
máy khách, đối tượng này sẽ đại diện cho đối tượng gọi phương thức bên phía
máy chủ. Đối tượng này được gọi là stub. Stub sẽ gọi kiến trúc RMI bên phía
máy khách và di chuyển dữ liệu qua mạng đến kiến trúc RMI trên máy chủ,
đến lượt nó sẽ gọi thực thi một đối tượng bè bạn bên phía máy chủ gọi là
skeleton.
Đối tượng skeleton sẽ gọi phương thức của đối tượng thật sự bên phía
máy chủ. Đến khi trả lại kết quả thì một cơ chế giống hệt như trên sẽ được
gọi thực thi nhưng theo thứ tự ngược lại, khi đó kết quả trả về sẽ được truyền
cho đối tượng skeleton trên máy chủ, và được đối tượng này truyền theo đường
mạng sử dụng kiến trúc RMI, tiếp đến nó sẽ gọi đối tượng stub bên phía máy
3
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
khách, và trả về giá trị cho đối tượng gọi phương thức.
Cái hay của kiến trúc đối tượng phân tán RMI là người lập trình chỉ cần
lập trình các lời gọi phương thức vì đối tượng được gọi đã hiện diện trong
máy ảo Java của nó.
2) Stub và skeletons
Stub và skeleton được phát sinh ra từ đối tượng gọi và đối tượng được
gọi bằng cách sử dụng một công cụ biên dịch của RMI là rmic. Các trình đóng
gói ứng dụng phải đảm bảo là các stubs phải được đóng gói kèm theo với các
đoạn mã bên phía máy khách hay các tập tin JAR, và các skeleton phải đi kèm
với các đoạn mã bên phía máy chủ hoặc các thư viện JAR.
Các Stub có thể được tự động tải về từ máy chủ web khi có yêu cầu. Hình
dưới đây minh họa luồng dữ liệu giữa stub và skeleton trong kiến trúc của RMI.
3) Xây dựng các đối tượng
Hầu như không có khác biệt giữa lập trình trên máy cục bộ và lập trình
phân tán trong RMI. Lập trình phân tán chỉ yêu cầu một ít yêu cầu lập trình.
Tất cả các lớp muốn có thể được triệu gọi từ xa thì phải có 2 phần:
phần giao diện (interface) và phần cài đặt (implementation). Phần giao diện
phải thừa kế từ một lớp của Java là lớp Remote. Phần cài đặt không những cài
đặt phần giao diện mà còn phải thừa kế từ một lớp của Java là lớp
UnicastRemoteObject.
4
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
Thật sự có một mạng liên lạc tồn tại dưới cơ chế gọi phương thức từ
xa, và mạng này có thể có lỗi hay bị ngắt kết nối hoàn toàn. Hoặc máy chủ có
thể bị lỗi. Vì vậy bên máy khách có thể có vài lỗi mà nó phải xử lý trong lập
trình phân tán. Những lỗi này xuất hiện dưới với dạng ngoại lệ
RemoteException, vì thế tất cả phương thức trên đối tượng của máy chủ được
thiết kế để được triệu gọi từ xa
phải khai báo là nó sẽ tung ra ngoại lệ RemoteException. Mã bên phía máy
người dùng nên xử lý những lỗi này khi nó xuất hiện.
+ Dưới đây là một giao diện đơn giản cho một lớp truyền vào và lấy ra một
String:
// Example.java
//
// Giao diện cho đối tượng triệu gọi từ xa
//
import java.rmi.*;
public interface Example extends Remote {
public void setString( String s ) throws RemoteException;
public String getString() throws RemoteException;
}
Và đây là phần cài đặt:
// ExampleServer.java
//
// Phần cài đặt đối tượng từ xa cho giao diện Example
//
import java.rmi.*;
import java.rmi.server.*;
public class ExampleServer extends UnicastRemoteObject implements
Example {
private String stringState;
5
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
public ExampleServer() throws RemoteException{}
public void setString( String s ) throws RemoteException{
stringState = s;
}
public String getString() throws RemoteException
{
eturn stringState;
}
}
Phần tếp theo chúng ta sẽ tạo stub và skeleton cho lớp ExampleServer
bằng cách sử dụng lệnh : rmic ExampleServer
4) RMI Registry
Chúng ta phải xác định được vị trí của đối tượng từ xa, RMI cung cấp
một máy chủ chuyên quản lý tên là RMI Registry để thực hiện chức năng này.
Một đối tượng có một tên (trong ví dụ này nó có tên là “Example”) và
một vị trí của máy (trong ví dụ là “localhost”). Trong đoạn mã sau, chúng ta sẽ
tạo một đối tượng ExampleServer và tạo một lối vào RMI Registry đặt trên
máy cục bộ và đặt cho nó một cái tên là Example.
Chúng ta sử dụng phương thức rebind() để tránh lỗi trong trường hợp
tên này đã tồn tại trong RMI Registry, ngược lại chúng ta cũng có thể sử dụng
phương thức bind(). Chúng ta chỉ cần chạy đoạn mã này một lần đến khi nào
tiến trình của RMI Registry còn hoạt động. Thông tin trong registry không được
lưu trữ xuống vĩnh viễn(persistent).
// Server.java
//
// Chương trình trên máy chủ tạo một đối tượng từ xa "Example" và đưa
nó vào
// RMI registry
//
import java.io.*;
6
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
import java.rmi.*;
import java.rmi.server.*;
public class Server {
public static void main ( String[] args ) throws RemoteException,
java.net.MalformedURLException {
//
// Create a new example object and enter it into the RMI registry
// located on "localhost" under the alias "Example"
ExampleServer es = new ExampleServer();
Naming.rebind( "rmi://localhost/Example", es );
}
}
5) Xây dựng chương trình bên phía máy khách
Cuối cùng chúng ta xây dựng một chương trình bên phía máy khách để
thực hiện lời gọi từ xa. Đầu tiên, chúng ta phải xác định được vị trí của đối
tượng bên phía máy chủ, vì vậy chúng ta phải tìm đối tượng Example trong
RMI Registry và gọi một phương thức để truyền vào một chuỗi và đọc ngược
nó ra và cuối cùng là xuất nó ra màn hình.
// ExampleClient.java
//
// Chương trình bên phía máy khác gọi đối tượng từ xa Example để
truyền vào một chuỗi và đọc nó ra
import java.rmi.*;
public class ExampleClient {
public static void main ( String[] args ) {
try {
// Tìm đối tượng từ xa "Example" trong RMI registry
Example example = (Example) Naming.lookup( "Example" );
7
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
//
// Truyền vào một chuỗi và đọc nó ra trở lại rồi xuất ra màn hình
example.setString( "Success!" );
System.out.println( example.getString() ); } catch (Exception e) {
e.printStackTrace();
}
}
}
Để chạy ví dụ chúng ta phải khởi động RMI Registry lên, chạy chương
trình bên phía máy chủ một lần, sau đó chúng ta có thể chạy chương trình bên
phía người dùng :
start rmiregistry
start java Server
java ExampleClient
Nếu thực hiện thành công bạn sẽ thấy kết quả là “Success” trên màn hình .
6) Triển khai RMI trên 2 máy khác nhau
Chúng ta sẽ xem xét ứng dụng RMI được viết và chạy một chương trình
trong một tiến trình, cùng một JVM và nó liên lạc với một tiến trình khác chạy
trên cùng máy. Khi chúng ta tách rời chức năng của hai máy ra, chúng ta sẽ xem
xét việc triển khai như thế nào.
Nếu chúng ta muốn chạy ví dụ trên 2 máy khác nhau thì :
Bên phía máy khách cần có các lớp sau: Example.class,
ExampleClient.class, ExampleServer_Stub.class
Bên phía máy chủ cần có các lớp sau: ExampleServer.class, Server.class,
Example.class, ExampleServer_Stub.class, ExampleServer_Skel.class
Để có thể linh động hơn, chúng ta có thể đặt tập tin
ExampleServer_Stub.class trên một máy chủ Web để tập tin này có thể được tải
xuống khi có yêu cầu nếu bạn sử dụng tùy chọn -Djava.rmi.server.codebase khi
thực hiện bằng dòng lệnh để chạy chương trình bên phía máy khách.
8
- Gvhd: TrÇn Hång ViÖt
Svtt: NguyÔn ThÞ An_ tin14HN
Ví dụ:
java -Djava.rmi.server.codebase=http://www.mywebserver.com/ ExampleClient.
9
nguon tai.lieu . vn