Tải bản đầy đủ (.pdf) (34 trang)

đồ án về RMI (Remote Method Invoke)

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 (911.21 KB, 34 trang )

SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 3
C
C
h
h
-
-
ơ
ơ
n
n
g
g


I
I






T
T


N
N
G


G


Q
Q
U
U
A
A
N
N


V
V




đ
đ




T
T
à
à
I

I


Lập trình phân tán là một trong những vấn đề nóng bỏng của cộng nghệ
phần mềm hiện nay.
Một trong những vấn đề đ-ợc giới lập trình quan tâm sâu sắc trong lập
trình mạng nói chung và lập trình cơ sở dữ liệu nói riêng, trong đó có một
ph-ơng thức khá quan trọng là RMI (Remote Method Invoke : tạm dịch là
ph-ơng thức gọi từ xa).
Thông th-ờng mỗi ch-ơng trình chúng ta có thể viết d-ới dạng thủ tục
(Procedure) hay hàm (Function) mà các hàm hay thủ tục này đ-ợc nạp thẳng
vào ký ức và thực thi ngay trên máy cụ bộ. Điều mà các lập trình viên quan
tâm ở đây không phải là cách cài đặt thủ tục hay hàm mà chính là đối số trả về
của chúng là nh- thế nào? Câu hỏi đặt ra ở đây là liệu có ph-ơng pháp nào để
gọi các hàm hay thủ tục từ một máy bấy kỳ nào đó trong cùng mạng để sử
dụng ngay trên máy thực thi đ-ợc không? Đây chính là nội dung chính của lập
trình mã lệnh và cũng là yếu tố chính trong lập trình phân tán đối t-ợng bằng
RMI. mang ý nghĩa triệu gọi ph-ơng thức từ xa là cách giao tiếp giữa các đói
t-ợng Java có mã lệnh cài đặt (bao gồm các ph-ơng ph-ơng thức, thuộc tính và
không loại trừ các ph-ơng thức gọi cơ sở dữ liệu) nằm trên các máy khác nhau
có thể triệu gọi lẫn nhau.
RMI đã rất thành công trong việc t-ơng tác các ứng dụng từ giao diện
ng-ời dùng. Chúng ta có thể định nghĩa các ph-ơng thức mà bao gồm sự t-ơng
tác giao diện ng-ời dùng và một khác hàng (Client) và sau đó tạo các t-ơng tác
kết nối bằng RMI.












SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 4
* Mô hình phân tán đối t-ợng.














Hình 1.1 cho ta mô hình triệu gọi đối t-ợng phân tán.
Theo thói quen thông th-ờng chúng ta đã lập trình theo phong cách gọi
qua lại giữa các môđun trên máy cục bộ. Với RMI trong java ta có thể thực
hiện ph-ơng thức gọi qua lại giữa các máy khác nh- biễu diễn trên.
Việc gọi ph-ơng thức từ xa thoạt nhìn có vẽ đơn giản nh-ng thực tế lại
phức tạp hơn nhiều ph-ơng pháp triệu gọi cục bộ.
* Các kỹ thuật lập trình phân tán đối t-ợng bằng RMI.

Có thể nói RMI là một mô hình khá rộng lớn trong lập trình Java và sau
đây là một số kỹ thuật điển hình:
* Vai trò của các lớp trung gian:
Nh- chúng ta đã gặp trong ph-ơng thứcgọi trên máy cục bộ là một
ph-ơng pháp gọi trực tiếp nh-ng điều này không thể dùng trong mô hình nhiều
máy gội lẫn nhau nên chúng ta phải dùng qua các lớp trung gian: STUB,
SKEL.
- Chuyển tham số trong các lời gọi ph-ơng thức từ xa.
- Tuần tự hóa (Seriazable) đối t-ợng.
- RMIregistry và các đăng ký đối t-ợng.
- Dùng một đối t-ợng sản sinh nhiều đối t-ợng.(Factory
Object)
Computer A


A
2

A
1
Computer C

C
1
C
3
C
2




Computer B

A
1
Hình 1.1
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 5
- Kỹ thuậy gọi đối t-ợng từ xa bằng ph-ơng thức động.
(Dynamic Method Invoke)
- Tự động kích hoạt đối t-ợng từ xa( Activation).
- Trình mồi nạp từ xa
- . . . và một số kỹ thuật khác.
Tìm hiểu về cơ sở dữ liệu phân tán.



































SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 6
C
C
h
h
-
-
ơ
ơ
n
n

g
g


I
I
I
I












C
C
ơ
ơ


s
s





l
l
ý
ý


t
t
h
h
u
u
y
y
ế
ế
t
t



II.1. Giới thiệu
Java là một ngôn ngữ lập trình do công ty Sun Microsystems phát triển
vào đầu thập kỷ 1990. Xuất phát điểm của ngôn ngữ này là một dự án nghiên
cứu của công ty trong đó lúc đầu các nhà nghiên cứu dùng C++. Ngay sau đó
nhóm nghiên cứu đã cho rằng họ cần một thứ gì đó tốt hơn thế. Các nhà nghiên
cứu này đều là các lập trình viên xuất sắc, do vậy họ đã bắt tay ngay vào việc
xây dựng một ngôn ngữ lập trình mới bằng cách tận dụng các ý t-ởng hay của

các ngôn ngữ lập trình khác. Với những điểm mạnh nh- h-ớng đối t-ợng, tính
khả chuyển cao, không phụ thuộc vào môi tr-ờng xử lý (phần cứng máy tính
và hệ điều hành), có khả năng biên dịch, hỗ trợ các th- viện cho lập trình các
ứng dụng CSDL phân tán và Internet, dễ truyền thông, Java đã và sẽ trở
thành một ngôn ngữ mạnh trong hiện tại và t-ơng lai.
Java là một ngôn ngữ lập trình còn khá mới mẻ, nh-ng nó lại có một số
đặc điểm khá mạnh và hỗ trợ việc lập trình trên Web tốt nên cũng đã đ-ợc
nhiều ng-ời lập trình sử dụng. Java là một NNLT h-ớng đối t-ợng, nó thừa
h-ởng khá nhiều đặc tính từ C và C++ nên việc học nó sẽ không khó khăn gì
đối với những ng-ời đã làm việc với C/C++, thậm chí nó còn đơn giản hơn.
Java đ-ợc xây dựng chủ yếu trong bộ công cụ phát triển Java (Java
Developers Kit - JDK ) do Sun cung cấp bao gồm một số ch-ơng trình tiện ích
cho phép bạn biên dịch, bắt lỗi và tạo tài liệu cho một ứng dụng Java và các
th- viện chuẩn của nó. Hiện nay trên thị tr-ờng đang có rất nhiều môi tr-ờng
pháp triển Java của hãng thứ ba rất tiện lợi (nh- Visual J++, Symantec Cafe, ),
nh-ng tất cả các ch-ơng trình này đều dựa trên nền JDK.
Các trình tiện ích của JDK bao gồm:
javac : Bộ biên dịch Java: Làm nhiệm vụ chuyển mã nguồn Java
sang bytecode.
java Bộ thông dịch Java: Thực thi các ứng dụng Java trực tiếp từ tập
tin lớp (class).
appletviewer : Một trình thông dịch Java thực thi các Java applet từ
tập tin HTML.
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 7
javadoc : Tạo tài liệu dạng HTML từ mã nguồn cùng với các chú
thích bên trong.
jdb Java debuger: Cho phép bạn thực hiện từng dòng trong ch-ơng
trình, đặt các điểm dừng (breakpoint), xem giá trị các biến.
javah : Tạo ra tập tin header của C cho phép C gọi hàm Java hoặc

ng-ợc lại.
javap : Trình dịch ng-ợc java (disassembler): Hiển thị các hàm và
dữ liệu truy cập đ-ợc bên trong một tập tin lớp đã dịch. Nó cũng cho
phép hiển thị nghĩa của bytecode.
Ngày nay các nhà phát triển phần mềm đã xây dựng thêm rất nhiều nhánh
mới nh- JavaMail( Java Th- Tín), JavaTAPI (Java Viển Thông),
II.2. Các Đặc Điểm Cơ Bản Của Java
H-ớng đối t-ợng : Lập trình h-ớng đối t-ợng (OOP) là ph-ơng
thức viết các ứng dụng dễ bảo trì, dễ nâng cấp và đặc biệt là có thể tái sử
dụng các mã lệnh. Java là một ngôn ngữ h-ớng đối t-ợng, do đó nó có đầy
đủ các đặc tính trên. Ngoài ra, th- viện lớp Java cung cấp khá đầy đủ cho
ng-ời lập trình để bắt đầu một dự án mới.
Java có khả năng đa luồng : Các ứng dụng viết bằng Java có thể
có nhiều tiến trình đ-ợc xử lý cùng một lúc. Một ứng dụng đơn luồng chỉ
có thể thực hiện một tác vụ tại một thời điểm: Giả sử ứng dụng đang bận
lấy từ trên mạng xuống một tập tin mất vài phút, trong thời gian này ứng
dụng không thể làm các việc khác nh- vẽ lại màn hình Với ứng dụng viết
bằng Java, bạn có thể tạo hai tiến trình song song làm việc: một tiến trình
nạp tập tin, một tiến trình khác làm nhiệm vụ cập nhật màn hình.
Java cung cấp khả năng lập trình trên mạng : cung cấp các công
cụ cũng cho phép thực hiện các phiên kết nối làm việc dễ ràng giữa các
máy tính trong mạng sử dụng giao thức TCP/IP. Các kết nối này dựa trên
cặp giá trị địc chỉ IP của máy và địa chỉ cổng TCP của dịch vụ (cặp giá trị
này gọi là một socket). Có hai chế độ kết nối chính: Datagram và
Client/Server.
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 8


II.3. Liên lạc trên Internet:

Giao thức: TCP / IP:
Khi hai hay nhiều máy tính nối mạng, chúng phải dùng một bộ quy -ớc
chung để có thể hiểu và nói chuyện đ-ợc với nhau. Một bộ quy -ớc nh- vậy
hay còn gọi là 1 giao thức. Trên Internet ngày nay, giao thức đ-ợc dùng phổ
biến nhất là TCP / IP.
Theo giao thức này, mỗi máy đ-ợc đặt cho 1 số riêng biệt gọi là địa chỉ
IP (có vai trò t-ơng tự nh- số điện thoại).
Chẳng hạn máy tính Web server của Microsoft có địa chỉ IP là:
207.46.230.219. Các số này là duy nhất, không có bất kỳ 1 máy nào đ-ợc phép
có địa chỉ IP trùng nhau trên toàn thế giới.
Khi một máy muốn tham gia vào Internet với t- cách là một máy chủ
(host hay Server) thì cần đ-ợc đăng ký với một tổ chức quốc tế gọi là InterNIC
(Internet Network Information Center) để đ-ợc cấp cho một địa chỉ IP.
Những con số của địa chỉ IP rất khó nhớ và không thân thiện cho ng-ời
dùng. Thay vào đó ng-ời ta đã đ-a ra khái niệm tên vùng. Thực ra tên vùng
chính là ánh xạ của địa chỉ IP.
Vd: Máy chủ Microsoft ở địa chỉ IP:
207.46.230.219 t-ơng ứng với tên www.microsoft.com
Một địa chỉ IP có thể đ-ợc đặt nhiều tên khác nhau nh-ng một tên chỉ có
thể t-ơng ứng với 1 IP.
Tên của máy chủ còn đ-ợc gọi là tên miền (domain name) bởi vì chúng
đ-ợc đặt theo thứ tự phân cấp của tên lãnh thổ, vùng, tổ chức Mỗi nhóm
phân cấp cách nhau bởi 1 dấu (.)
Ví dụ: Java.sun.com
Tên MT Tên tổ chức Tên vùng
* Giao tiếp trên mạng theo mô hình khách/chủ :
Theo mô hình này thì mỗi dịch vụ trên mạng sẽ đ-ợc thực hiện bởi một
cặp ch-ơng trình. Một ch-ơng trình đóng vai trò là nhà cung cấp dịch vụ, đ-ợc
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 9

gọi là ch-ơng trình Server. Một ch-ơng trình đóng vai trò là ng-ời yêu cầu
dịch vụ hay còn gọi là client (khách hàng). Một server cần phải phục vụ đ-ợc
cho nhiều client. Client/Server chỉ là khái niệm mang tính Logic. Nghĩa là cả
hai ch-ơng trình đều có thể cùng chạy trên một máy vật lý.
Có rất nhiều ví dụ về những dịch vụ dựa trên mô hình client / server nh-
vậy. Chẳng hạn nh-: trình duyệt và Web server, trình gởi mail và Mail server

II.4. Mô hình ứng dụng 3_tầng(3_tier application) :
Sự môđun hoá là một xu thế bao trùm trên nhiều ngành kỹ thuật hiện nay.
Trong ngành CNTT thì xu thế đó thể hiện rất đậm nét.
Tr-ớc tiên là sự môđun hoá phần cứng. ý t-ởng này đã đ-ợc định h-ớng
xuyên suốt trong quá trình phát triển của phần cứng máy tính. Ngay từ những
bản thiết kế máy tính đầu tiên ng-ời ta đã biết phân tách phần Công việc ra
khỏi phần l-u trữ và hiển thị. Quá trình môđun hoá diễn ra theo h-ớng ngày
càng triệt để hơn. Ngày nay trên một thiết bị nhỏ nh- Card âm thanh chẳng
hạn ta cũng có thể trông thấy những môđun nhỏ hơn nữa đ-ợc sản xuất từ
những hãng khác nhau.
Sự môđun hoá có một ý nghĩa rất quan trọng. Nó tạo thuận lợi cho việc
bảo trì, sửa chữa cũng nh- đổi mới, phát triển sản phẩm.
ý t-ởng rất giá trị này đã nhanh chóng đ-ợc ng-ời ta áp dụng vào lĩnh vực
phần mềm. Cũng nh- ở phần cứng, trong lĩnh vực phát triển phần mềm xu thế
môđun hoá diễn ra theo h-ớng ngày càng sâu sắc, triệt để hơn.
Nằm trong xu h-ớng lớn đó, từ lâu nay ng-ời ta đã sử dụng mô hình ứng
dụng 2 lớp. Theo mô hình này thì một ứng dụng đ-ợc chia làm 2 môđun là
môđun ứng dụng và môđun cơ sở dữ liệu. Trong môđun ứng dụng bao gồm cả
phần Logic Công việc và phần trình bày (th-ờng gọi là phần giao diện ng-ời
dùng).
Trong các ứng dụng nhỏ thì mô hình này không đặt ra vấn đề gì cả, bởi vì
lúc đó mỗi ứng dụng chỉ thực hiện một tiến trình Công việc đặc thù.
Trong các hệ thống lớn thì nhiều ứng dụng có thể cùng sử dụng những

thành phần Logic Công việc nào đó. Mỗi khi cần thay đổi Logic công việc thì
buộc phải sửa đổi tất cả các ứng dụng. Điều này gây ra những khó khăn và
lãng phí.
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 10
Để giải quyết vần đề này ng-ời ta đã đ-a ra giải pháp mô hình ứng dụng
3 lớp. Từ 2 lớp chuyển sang 3 lớp hay nhiều lớp, đây lại là một minh chứng
cho xu thế môđun hoá.
Theo mô hình 3 lớp thì một ứng dụng sẽ đ-ợc chia làm 3 môđun (hay 3
lớp) là : trình bày ứng dụng, lớp Logic công việc và lớp CSDL





















Công nghệ Rmi chính là ph-ơng pháp tuyệt hảo để xây dựng các ứng
dụng 3 lớp trên mạng bằng ngôn ngữ Java. Với Rmi có thể dễ dàng tách phần
Logic công việc ra khỏi ứng dụng. ứng dụng của bạn có thể chạy trên máy này
còn phần Logic công việc của nó có thể nằm đâu đó trên mạng toàn cầu. Đây
là một ý t-ởng rất thú vị và hiện đang là đề tài nóng bỏng của công nghệ phần
mềm.


Hình II.4.a Mô hình ứng dụng 2_tầng
Appication
Database
Trình bày
Logic công
việc
CSDL
Application
Database
Application
Logic Công việc
Database
Hình II.4.b Mô hình ứng dụng 3_tầng
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 11
II.5. Các đặc tr-ng của công nghệ Java RMI
Đúng nh- tên gọi của nó, mục đích của công nghệ RMI là đ-a ra giải
pháp cho phép một số đối t-ợng Java đang nằm trên máy ảo Java này có thể
triệu gọi đến các ph-ơng thức của một đối t-ợng Java đang nằm trên một máy
ảo Java khác (tất nhiên là JVM này có thể nằm trên một máy tính khác trên
mạng).
Bằng cách này, một đối t-ợng có thể nhờ một đối t-ợng "chuyên nghiệp"

trên máy khác tính toán hộ cho mình một khâu đoạn nào đó trong ch-ơng
trình, sau đó nhận về kết quả và tiếp tục tiến trình xử lý. Điều này giống nh-
một công ty sử dụng nhiều chi tiết đ-ợc chế tạo bởi các công ty khác để tạo ra
sản phẩm của mình.
Mô hình ứng dụng phân tán nh- trên giúp ta phối hợp sức mạnh của
nhiều máy tính để tạo nên sức mạnh tổng thể, một quy mô mới có tính kinh tế
cao hơn.
Trong mô hình nay, đối t-ợng yêu cầu dịch vụ từ xa đ-ợc gọi là RMI
client. Còn đối t-ợng cung cấp dịch vụ gọi là RMI Server.
Do hai đối t-ợng năm trên hai máy khác nhau nên nó hoạt động trên hai
tiến trình hay hai không gian địa chỉ khác nhau. Ví dụ, khi ta truyền con trỏ
cho một ph-ơng thức ở xa, trên máy client thì con trỏ này tồn tại nh-ng trên
máy server (nơi có đối t-ợng thực thi ph-ơng thức) sẽ không có bất kỳ vùng
nhớ nào đ-ợc cấp phát giành cho con trỏ. Lời gọi một ph-ơng thức cục bộ (trên
cùng một máy) luôn trả về kết quả trong khi lời gọi các ph-ơng thức từ xa phải
thông qua kết nối mạng và lúc nào cũng có thể bị ngắt quảng do gặp sự cố. Để
giải quyết khó khăn trên, đối t-ợng client Rmi sẽ gọi đến đối t-ợng server Rmi
thông qua 2 lớp trung gian. Một lớp nằm trên máy client gọi là lớp móc câu
(stub) và một lớp khác nằm trên máy server gọi là lớp cần câu (skeleton). Lớp
stub đóng vai trò nh- là một ng-ời đại diện toàn quyền cho một "công ty"
chuyên cung cấp dịch vụ, đ-ợc cử đến làm việc ở máy client. Đối t-ợng nào ở
máy này có nhu cầu "mua" các dịch vụ của "công ty" thì sẽ đến đăng ký ở
ng-ời đại diện stub. Stub sẽ liên lạc với trụ sở "công ty" của mình để thực hiện
yêu cầu. Nh-ng sự liên lạc này còn phải thông qua một ng-ời "th- ký" nữa tên
là skeleton nằm ở máy server.
Để một đối t-ợng có khả năng "phục vụ từ xa" cho đối t-ợng khác thì đối
t-ợng đó nhất thiết phải đ-ợc tạo ra từ một lớp thi công giao diện xa (remote
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 12
interface) nào đó. Các đối t-ợng client sẽ "nhờ vả" đối t-ợng server thông qua

giao diện ấy. Các yêu cầu tính toán đ-ợc diễn đạt bởi đặc tả của các ph-ơng
thức trong lớp interface. Còn chi tiết cài đặt của các ph-ơng thức này lại đ-ợc
thực hiện trong lớp thi công giao diện. Nhờ sự tách biệt lớp Interface và lớp
Interface Implement (thi công giao diện) nên ng-ời ta có thể tuỳ ý sửa đổi,
nâng cấp các tính năng trong lớp thi công mà toàn hệ thống không hề bị ảnh
h-ởng.
Đây chính là nguyên lý để tách tầng Logic công việc ra khỏi phần trình
bày ứng dụng trong mô hình ứng dụng 3_tầng đã đề cập ở trên.
Nh- vậy, việc xây dựng một ch-ơng trình Java RMI đ-ợc triển khai qua
các b-ớc sau:
1. Xây dựng giao diện xa chứa đặc tả chứa các ph-ơng thức gọi xa.
2. Xây dựng lớp thi công giao diện để cài đặt các ph-ơng thức trên. Đây
chính là RMI server.
3. Tạo ra các lớp stub và skeleton cho đối t-ợng RMI server.
4. Viết ch-ơng trình để đăng ký đối t-ợng chủ RMI này vào "sổ đăng ký"
các đối t-ợng gọi xa của máy chủ.
5. Xây dựng đối t-ợng RMI client để triệu gọi đến các ph-ơng thức của
đối t-ợng RMI server thông qua lớp giao diện của nó.
Trên đây là nguyên lý chung để triển khai một ứng dụng Java RMI.
Những chi tiết kỹ thuật của quá trình này sẽ đ-ợc trình bày rõ trong phần triển
khai ứng dụng ở phía d-ới :
Tóm lại, một ứng dụng RMI hoàn chỉnh sẽ bao gồm các thành phần sau:
Trên máy chủ có:
- Lớp giao diện xa (Interface)
- Lớp thi công giao diện (Interface Implement)
- Lớp stub và skeleton.
- Lớp đăng ký và ch-ơng trình Rmiregistry chạy ở chế độ background.
Trên máy trạm có:
- Lớp giao diện
- Lớp stub

SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 13
- Lớp RMI Client để gọi các ph-ơng thức từ xa.
II.6. Cách chuyển tham số trong lời gọi ph-ơng
thức từ xa Rmi
Trong ngôn ngữ Java, các đối t-ợng đều đ-ợc truyền theo tham chiếu.
Còn các kiểu dữ liệu cơ bản nh- int, char, đ-ợc truyền theo tham trị. Đây là
nguyên tắc truyền tham số cho các lời gọi hàm từ xa trong Rmi thì nguyên tắc
này thay đổi hoàn toàn.
- Tất cả các dữ liệu cơ bản nh- int, char đều đ-ợc truyền theo tham trị.
- Tất cả các dữ liệu kiểu đối t-ợng muốn truyền qua mạng đều phải cài
đặt 1 trong 2 giao tiếp là Remote hoặc Serializable. Các đối t-ợng cài đặt giao
tiếp Remote đ-ợc truyền theo tham chiếu còn các đối t-ợng cài đặt giao tiếp
Serializable sẽ đ-ợc truyền theo tham trị.
II.6.1. Chuyển đối t-ợng đến trình chủ theo tham trị:
Hầu hết các kiểu dữ liệu đối t-ợng cơ bản nh- String, Date, Time trong
Java đều đã đ-ợc cài đặt giao tiếp Serinlizable cho nên chúng đ-ợc truyền cho
các lời gọi hàm xa theo trị.
Với cơ chế truyền tham số đối t-ợng theo trị trong các lời gọi hàm xa, đối
t-ợng tham số sẽ đ-ợc đóng gói và chuyển toàn bộ đến máy chủ (nơi tiếp nhận
tham số và thực thi ph-ơng thức t-ơng ứng). Tại máy chủ, đối t-ợng sẽ đ-ợc
bung ra lại trạng thái ban đầu và đ-a vào sử dụng. Quá trình đóng gói tham số
trên máy khách đ-ợc thực hiện bởi lớp trung gian - Stub, ng-ợc lại quá trình
mở gói dữ liệu để khôi phục đối t-ợng tham số diễn ra trên máy chủ đ-ợc thực
hiện bởi lớp trung gian - Skel. Quy trình chuyển tham số qua lại giữa hai lớp -
Stub và - Skel này trong lập trình phân tán gọi là cơ chế mashaling data.
II.6.2. Chuyển đối t-ợng đến trình chủ theo tham chiếu
Trong tr-ờng hợp đối t-ợng tham số đ-ợc truyền qua mạng có kích th-ớc
quá lớn thì việc đóng gói toàn bộ đối t-ợng để truyền đi sẽ ảnh h-ởng đến tốc
độ thực thi của ch-ơng trình. Do vậy cần phải có một giải pháp để trình chủ có

thể tham chiếu và xử lý trực tiếp đối t-ợng tham số đang nằm ở máy khách mà
đối t-ợng này không cần phải đ-ợc chuyển đến máy chủ. Điều này hoàn toàn
có thể thực hiện đ-ợc bằng cách cho phép trình chủ gọi hàm xa ng-ợc lại đến
trình khách. Thực ra lúc này mỗi phần ứng dụng nêu trên đều đóng cả hai vai
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 14
trò là trình chủ và trình khách Rmi. Thật ra với ý nghĩa là ng-ời cung cấp các
dịch vụ tính toán thì vai trò Server của đối t-ợng chủ vẫn không thay đổi
nh-ng khi cần truyền tham số kiểu đối t-ợng (theo tham chiếu) qua mạng thì
nó tạm thời "hạ mình" đóng vai khách để tham chiếu đến đối t-ợng tham số
đang nằm trên máy khách. Để có thể tham chiếu đ-ợc qua mạng thì đối t-ợng
tham số cần phải đ-ợc xây dựng theo các trình tự y nh- là một Rmi Server
"Thứ thiệt'
Nghĩa là :
- Nó phải cài đặt giao tiếp Remote
- Phải kèm theo các lớp trung gian Stub và Skel đ-ợc tạo ra bởi trình
Rmic của Java.
- Một lớp Stub của nó phải đ-ợc đặt trên máy chủ (lúc nay
đang tạm là khách) nh- một đại diện toàn quyền (để thực hiện cơ chế
truyền dữ liệu mashaling đã đề cập).
- Tuy nhiên Rmi cho phép đối t-ợng kiểu này không cần
phải đăng ký với rmiregistry.
Cơ chế gọi ng-ợc từ xa của trình chủ đến trình khách thông qua tham
chiếu (cơ chế call back) này rất hữu hiệu cho trình khách thiết lập các yêu cầu
tuỳ biến mà không phải phụ thuộc quá nhiều vào trình chủ. Một cách hình
t-ợng thì lúc này khách hàng đã đ-ợc phục vụ tốt hơn.
Sở dĩ đ-ợc nh- vậy là do trình khách có thể truyền tham số một cách
"thoả mái" trong lời gọi hàm xa mà không phải lo lắng về kích th-ớc của đối
t-ợng tham số. Kỹ thuật Callback còn cho phép trình chủ đánh thức trình
khách để trả về kết quả mỗi khi tính toán xong. Điều này rất có ý nghĩa trong

thực tế. Bởi vì một lẽ đơn giản là khi client yêu cầu một dịch vụ nó không thể
biết chính xác là trong bao lâu thì server sẽ tính toán xong. Và sẽ khá bất tiện
khi client cứ phải định kỳ gọi đến server để thăm dò xem server đã tính toán
xong ch-a. Callback cho phép server chủ động gọi hàm xa ng-ợc lại đến client
để trả về kết quả.
Kỹ thuật call back làm giảm rất nhiều dung l-ợng dữ liệu phải l-u thông
trên mạng, do đó làm tăng đáng kể tốc độ thực thi của ch-ơng trình.
Thực ra, nội dung của Rmi còn bao gồm một số vấn đề khác nh- tự động
nạp lớp Client từ Web Server, đối t-ợng Factory Đấy là những kỹ thuật mang
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 15
tính phụ trợ, bổ sung và ngày càng phong phú hơn cùng với các phiên bản mới
của JDK. Vì phạm vi bản báo cáo có hạn nên những nội dung này xin đ-ợc
trình bày trong một dịp khác.
II.7 khai thác cơ sở dữ liệu trên java
Ngày nay có rất nhiều hệ thống Database khác nhau, nếu không có một
chuẩn chung để giao tiếp giữa những hệ thống Database này thì khi ứng dụng
chuyển đổi từ hệ thống Database này sang hệ thống khác, mã của ch-ơng trình
phải thay đổi lại cho phù hợp. Để giải quyết tình trạng đó, ng-ời ta đã đ-a ra
một chuẩn để các kiểu Database khác nhau có thể giao tiếp đ-ợc với nhau. Đó
là ODBC. ODBC là một lớp trừu t-ợng giữa ch-ơng trình ứng dụng và hệ
thống Database. Lớp này cho phép chúng ta sử dụng các phát biểu theo ngôn
ngữ SQL để truy xuất những Database có hổ trợ ngôn ngữ SQL và một số
Database khác.
II.7.1. Cơ chế ODBC
ODBC ( Open Database Connectivity ) là một giao tiếp CSDL phổ biến
nhất trong các máy tính cá nhân theo chuẩn IBM và dần dần đi vào các môi
tr-ờng khác. ODBC cung cấp các hàm cho phép các ngôn ngữ lập trình truy
cập vào CSDL, các thao tác này bao gồm việc thêm, sửa, xoá, xem dữ liệu,
thông tin chi tiết về CSDL

II.7.2. Cơ chế JDBC
II.7.2.1. Tổng quan về JDBC
JDBC - Java Database Connectivity API là một phần của các hàm Java
API cho môi tr-ờng xí nghiệp do Sun Microsystems, Inc phát triển. JBCD đ-ợc
coi là một cố gắng chuẩn hoá đầu tiên để tích hợp CSDL quan hệ với các
ch-ơng trình Java.
JDBC chứa một tập hợp các đối t-ợng và các ph-ơng thức của CSDL
quan hệ để giao tiếp với các nguồn dữ liệu SQL ( SQL Data Sources ) . Các
JDBC API đ-ợc tích hợp trong Java và là một phần cơ bản trong các cài đặt
của máy ảo Java.
JDBC đ-ợc giới thiệu lần đầu vào năm 1996 với bản nháp JDBC 0.50.
Đ-ợc cập nhật bổ xung và hoàn chỉnh qua các phiên bản 1.0, 1.10, 1.20, 1.22
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 16
và hiện nay là phiên bản mới nhất JDBC 2.0 đ-ợc tích hợp trong các phiên bản
JDK 1.2, 1.22 và 1.3.
JDBC đ-ợc thiết kế dựa trên X/Open SQL Call level Interface ( CLI giao
tiếp goi SQL theo chuẩn X/Open)
II.7.2.2. Các kiểu trình điều khiển JDBC
Các trình điều khiển JDBC có thể phân thành 4 kiểu sau phụ thuộc vào
cách thức hoạt động và các kết nối với CSDL:
Cầu nối JDBC - ODBC : cung cấp các truy cập JDBC thông qua các truy
cập ODBC. Vì trong nhiều CSDL máy khách các lệnh ODBC và lệnh CSDL
phải đ-ợc nạp tr-ớc trong máy khách đó, nên kiểu điều khiển này rất thích hợp
với các ứng dụng chạy trên nền máy chủ trong kiến trúc 3 lớp Java.
Trình API gốc có một phần Java ( Native - API partly - Java technology -
based drive) chuyển các lệnh gọi API trên máy khách của CSDL. Nh- thế nó
đòi hỏi trên máy khách cũng cần phải nạp tr-ớc một số lệnh nhị phân của các
trình chạy trên máy khách CSDL.
Trình giao thức gốc hoàn toàn Java ( Native - protocol Java techology -

based drive): biến các lệnh gọi JDBC thành các giao thức mạng gọi trực tiếp từ
hệ quản trị CSDL. Trình này cho phép gọi trực tiếp từ máy khách đến máy chủ
chứa DBMS và là giải pháp thực tế cho việc truy cập Intranet. Từ khi các giao
thức này là thuộc tính của CSDL, các nhà cung ứng CSDL cũng muốn trở
thành nguồn tài nguyên chính cho các trình theo phong cách này.
II.7.2.3. Cơ chế hoạt động của JDBC
Cơ chế hoạt động của JDBC t-ơng tự nh- ODBC nh-ng thông qua các đối
t-ợng.
Ch-ơng trình Java tạo một đối t-ợng kết nối (connection object)
để thực hiện việc kết nối với CSDL.
Tạo một đối t-ợng Statement (câu lệnh) và chuyển các câu lệnh
SQL đến CSDL thông qua đối t-ợng này và nhận biết về các kết quả( có thể
là các thông tin hay tập các Records). Để giảm thời gian trễ, các tập tin
JDBC class th-ờng đ-ợc nạp sẵn trên máy khách.
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 17
Các lớp JDBC nằm trong khối Java.sql và mọi ch-ơng trình Java đều
dùng lên các đối t-ợng và ph-ơng thức trong khối java.sql để đọc và viết lên
nguồn dữ liệu.
Một ch-ơng trình Java dùng JDBC cần một trình điều khiển cho nguồn
dữ liệu mà nó cần giao tiếp. Trình điều khiển này có thể là một modun gốc
(native modunle) nh- JDBCODBC.dll (th- viện cầu nối JDBC-ODBC ), hay
cũng có thể là một ch-ơng trình Java khác trao đổi với máy chủ thông qua các
giao thức HTTP, hay RPC
Trong tr-ờng hợp một ứng dụng làm việc với nhiều cơ sở dữ liệu, JDBC
có một trình quản lý các bộ điều khiển và cung cấp danh sách các bộ điều
khiển đã đ-ợc ứng dụng sử dụng.

II.7.2.4. Nối kết với CSDL qua khối JAVA.SQL
JDBC đ-ợc cài đặt thông qua khối java.sql. Khối này chứa tất cả các

lớp và ph-ơng thức của JDBC và đ-ợc phân thành hai phần:phần cơ sở(Code
API) đuợc cài đặt kèm theo JDK 1.2,phần mở rộng (Standard Extension)sẽ
đ-ợc cài đặt riêng nh- phần tuỳ chọn.
II.7.3 Cơ bản về mô hình cơ sở dữ liệu phân tán
Công nghệ và cơ sở dữ liệu phân tán(distributed database systems,DDB)
là sự hợp nhất của hai h-ớng tiếp cận đối với quá trình xử lý dữ liệu.Công nghệ
CSDL và công nghệ mạng máy tính .Nh- các cơ sở dữ liệu tr-ớc đây là những
CSDL tập trung có nghĩa là CSDLchỉ đ-ợc l-u trữ trên 1 máy chủ nào đócác
máy con muốn dùng CSDL chuyển mình từ mô thức xử lý
Một trong những động lực chủ yếu thúc đẩyviệc sử dụng hệ CSDL là
nhu cầu thích hợp các dữ liệu hoạt tác của một xí nghiệp và cho phép truy xuất
tập trung .Trong khi đó công nghệ mạng máy tính đi ng-ợc lại với mọi nổ lực
tập trung hóa .
Thoáng qua ,chúng ta rất khó hình dung ra làm cách nào để tổng hợp hai
h-ớng tiếp cận trái ng-ợc nhau cho ra một công nghệ mạnh mẽ và có nhiều
triển vọng so với từng công nghẹ riêng lẽ .Mục tiêu quan trọng nhất của công
nghệ CSDL ở đây là tính hợp không phải là sự tập trung hóa
Xử lý dữ liệu phân tán
Thuật ngữ xử lý phân tán(distributed processing)hoặc tính phân tán
(distributed Computing)trong những năm trở lại đây thuật ngữ này bị lạm dụng
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 18
nhiều nhất trongngành máy tính .Cũng có thể tùy theo các công việc xử lý
khác nhau mà ng-ời ta đ-a ra các thuật ngữ khác nhau
Câu hỏi đ-ợc đặt ra là :Những gì đ-ợc phân tánmột trong những điều có
thể là thiết bị xử lý
Chúng ta có thể có một khái niệm hệ phân tán nh- sau
Mạng máy tính một phần mềm xử lý phân tán trên mạng =Hệ phân tán
Để xử lý dữ liệu phân tán chúng ta có các hệ thống xử lý phân tán có thể
phân loại dựa vào một số chuẩn:mức độ kết nối ,cấu trúc t-ơng giao ,sự liên

đối giữa các thành phần,sự đồng bộ hóa giữa các thành phần
-Mức độ kết nối (degree of coupling)muốn nói đến một đơn vị đo h-ớng
nhằm xác định xem các thành phần xử lý đ-ợc kết nối với nhau chặt chẽ đến
mức độ nào
-T-ơng tự các chuẩn khác cũng có những đặc tr-ng riêng
-Cũng không ít câu hỏi đặt ra la tại sao chúng ta lại thực hiện phân tán
?Nhiều câu hỏi trả lời kinh điển cho câu hỏi này đã chỉ ra rằng việt sử dụng
phân tán nhằm thích ứng tốt hơn với việc phân bố ngày càng rộng rãi các công
ti xí nghiệp và các CSDLtrên thế giới .Tuy nhiên từ gốc độ tổng quát hơn
,chúng ta có thể khẳng định rằng lý do cơ bản của viêc xử lý phân tán là do có
thể giải quyết tốt hơn các bài toán lớn và phức tạp .Nói một cách đơn giản hơn
đây cũng chính là ph-ơng pháp chia để trị.
Hệ cơ sở dữ liẹu phân tán
-Chúng ta có thể định nghĩa CSDL phân tán là một tập hợp nhiều CSDL
co biến đổi logic và đ-ợc phân bố trên một mạng máy tính. Vậy thì hệ quản trị
cơ sở dữ liệu phân tán (distributed database mângement systems,viết tắc là
distributed DBMS) đ-ợc định nghĩa là một hệ thống phần mềm cho phép xử lý
các hệ CSDLphân tán va làm cho viêc phân tán trơ nên vô hình đối với ng-ời
sử dụng .Hai thuật ngữ quan trọng trong các định nghĩa này là biến đổi logic
và phân bố trên
0mạng máy tính
để tạo một hệ CSDL phân tán ,các tập tin không chỉ có tính biến đổi logic
mà chúng còn phải co cấu trúc và đ-ợc truy xuất qua một giao diện chung
.ngoài ra một hếCDLphân tán không phải là hệ thống mà trong đó đã là sự hiển
diện của một mạng máy tính ,CSDL chỉ nằm tại một nút mạng



SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 19























II.7.4 Khai thác CSDL bằng Java
Để có thể làm việc với dữ liệu của một CSDL, một ch-ơng trình Java phải
tuân theo các b-ớc sau :
Thực hiện một kết nối với CSDL : ch-ơng trình Java sẽ gọi
ph-ơng thức getConnection() để nhận về đối t-ợng Connect.
Sau đó thực hiện các lệnh : các ch-ơng trình Java chỉ thực hiện
đ-ợc các lệnh trên CSDL thông qua đối t-ợng Statement.
Các câu lệnh SQL có thể đ-ợc thực hiện tức thì thông qua đối t-ợng

Statement, có thể là một câu lệnh biên dịch tr-ớc ( đối t-ợng

Mạng truyền
dữ liệu
Trạm 5
Trạm 4
Trạm 3
Trạm 1
Trạm 2
Hình II.7.3.a CSDL Trung tâm trên một mạng
Mạng truyền
dữ liệu
Trạm 5
Trạm 1
Trạm 2
Trạm 4
Trạm 3
Hình II.7.3.b Môi tr-ờng của CSDL phân tán
SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 20
PreparedStatement) hay là có thể là lệnh gọi các thủ tục cài sẵn (stored
Procedure) trongCSDL (đối t-ợng CallableStatement).
Trong tr-ờng hợp có sử dụng trình quản lý transaction, các ph-ơng thức
rollback() đ-ợc dùng để phục hồi trạng thái tr-ớc đó và commit() để xác nhận
việc thực hiện.
Để chấm dứt cần xóa kết nối, xóa các đối t-ợng để giải phóng tài nguyên
của hệ thống.





















SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 21
Ch-ơng III phân tích hệ thống

III.1. Bảng Csdl Trên server










III.2. Các lớp chính trong ch-ơng trình.
III.2.1.Server
Lồùp data : Lổu thọng tin vóử mọỹt
sinh vión nhổ MaSV,Ho&Ten vaỡ Lồùp
import java.lang.String;
import java.io.Serializable;
public class data implements Serializable {
protected String masv;
protected String name;
protected String lop;
// Phổồng thổùc khồới taỷo mọỹt õọỳi tổồỹng
sinh vón
public data(String p0, String p1, String
p2) {
}
// Phổồng thổùc traớ vóử Maợ SV
public String getMsv() {
}
// Phổồng thổùc traớ vóử Tón SV
public String getName() {
}
// Phổồng thổùc traớ vó ửLlồùp
public String getLop() {
}


Lồùp Dataintf: Lồùp maỡ caùc phổồng thổùc
chổa õởnh nghộa
import java.rmi.RemoteException;

import java.lang.String;
import java.util.Vector;

SVTH: Trần Hải Long-Nguyễn Quang Tuấn GVHD: Nguyến Tấn Khôi
Trang 22
import java.rmi.Remote;
public interface DataIntf extends Remote {
data getHten(String p0) throws
RemoteException;
data getMaSV(String p0) throws
RemoteException;
Vector getListSV(String p0) throws
RemoteException;
String request(String p0) throws
RemoteException;
}
}
Lồùp DataImpl: Lồùp maỡ caùc phổồng thổùc
õổồỹc õởnh nghộa bồới lồùp DataIntf
import java.rmi.RemoteException;
import java.lang.String;
import java.awt.TextArea;
import java.sql.Statement;
import java.util.Vector;
public synchronized class DataImpl
implements DataIntf {
// fields
SQL sq;
Statement statement;
TextArea status;

TextArea txt;
String str;
public DataImpl(Statement p0, TextArea p1,
TextArea p2) throws RemoteException {
// CONSTRUCTOR implementation not
available
}
public data getHten(String p0) throws
RemoteException {
// implementation not available
}
public data getMaSV(String p0) throws
RemoteException {
// implementation not available
}

public Vector getListSV(String p0) throws
RemoteException {
// implementation not available
}
SVTH: TrÇn H¶i Long-NguyÔn Quang TuÊn GVHD: NguyÕn TÊn Kh«i
Trang 23

public String request(String p0) throws
RemoteException {
// implementation not available
}

}
Låïp DataImpl_Skel

import java.rmi.server.Skeleton;
import java.rmi.server.RemoteCall;
import java.lang.Exception;
import java.rmi.RemoteException;
import java.rmi.server.Operation;
import java.rmi.Remote;
public final synchronized class
DataImpl_Skel implements Skeleton {
// fields
private static Operation[] operations;
private static final long interfaceHash;
public DataImpl_Skel() {
// CONSTRUCTOR implementation not
available
}
public Operation[] getOperations() {
// implementation not available
}
public void dispatch(Remote p0, RemoteCall
p1, int p2, long p3) throws RemoteException,
Exception {
// implementation not available
}

static {
// implementation not available
}

}


Låp DataImpl_Stub
import java.rmi.server.RemoteRef;
import java.rmi.RemoteException;
import java.rmi.server.RemoteStub;
import java.lang.String;
import java.util.Vector;
import java.rmi.server.Operation;
SVTH: TrÇn H¶i Long-NguyÔn Quang TuÊn GVHD: NguyÕn TÊn Kh«i
Trang 24
public final synchronized class
DataImpl_Stub extends RemoteStub implements
DataIntf {
// fields
private static Operation[] operations;
private static final long interfaceHash;
public DataImpl_Stub() {
// CONSTRUCTOR implementation not
available
}

public DataImpl_Stub(RemoteRef p0) {
// CONSTRUCTOR implementation not
available
}
public data getHten(String p0) throws
RemoteException {
// implementation not available
}

public Vector getListSV(String p0) throws

RemoteException {
// implementation not available
}

public data getMaSV(String p0) throws
RemoteException {
// implementation not available
}
public String request(String p0) throws
RemoteException {
}
static {
}
}

Låp IntStatement Låïp khåíi taûo CSDL
import java.sql.Connection;
import java.lang.String;
import java.sql.Statement;
import java.awt.TextArea;
import java.io.Serializable;
public synchronized class IntStatement
implements Serializable {
// fields
SVTH: TrÇn H¶i Long-NguyÔn Quang TuÊn GVHD: NguyÕn TÊn Kh«i
Trang 25
TextArea txtStatus;
String str;
boolean ok;
String id;

String pass;
String url;
String myName;
String myPass;
Connection connection;
Statement statement;

public IntStatement(TextArea p0, String
p1) {
// CONSTRUCTOR implementation not
available
}
public void run() {
// implementation not available
}
public boolean getCmd() {
// implementation not available
}
public Statement getStatement() {
// implementation not available
}

}




Låp SQL: Låïp truy váún CSDL
import java.lang.String;
import java.sql.Statement;

import java.util.Vector;

public synchronized class SQL {
// fields
Statement statement;

public SQL(Statement p0) {
// CONSTRUCTOR implementation not
available
}
public Vector getListSV(String p0) {
SVTH: TrÇn H¶i Long-NguyÔn Quang TuÊn GVHD: NguyÕn TÊn Kh«i
Trang 26
// implementation not available
}
public data getMaSV(String p0) {
// implementation not available
}
public data getHten(String p0) {
// implementation not available
}
}
Låp MainServer: Låïp chênh cuía Server
import java.lang.Exception;
import java.lang.String;
import java.awt.Button;
public synchronized class MainServer {
// fields
Button nod;
public MainServer() {

// CONSTRUCTOR implementation not
available
}
public static void main(String[] p0)
throws Exception {
// implementation not available
}
}

III.2.2. Client
Låïp Main: Låïp chênh cuía Client
import java.awt.Frame;
import java.awt.Event;
import java.lang.String;
import java.awt.TextArea;

public synchronized class Main extends Frame
{
// fields
MyMenuBar menuBar;
TextArea txt;
TextArea txt1;
dlgAbout about;
dlgMessage message;
dlgConfig config;
dlgFind find;
data d;
DataIntf intf;
SVTH: TrÇn H¶i Long-NguyÔn Quang TuÊn GVHD: NguyÕn TÊn Kh«i
Trang 27


public Main() {
// CONSTRUCTOR implementation not
available
}

public static void main(String[] p0) {
// implementation not available
}

void setup() {
// implementation not available
}

void information() {
// implementation not available
}

void setupMenuBar() {
// implementation not available
}
void init() {
// implementation not available
}

public boolean handleEvent(Event p0) {
// implementation not available
}

void statusMenu() {

// implementation not available
}

void error() {
// implementation not available
}

}







×