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

LẬP TRÌNH BẰNG CÁC PHƯƠNG PHÁP PHÂN TÁN ĐỂ ĐIỀU KHIỂN BÃI ĐỖ XE

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 (504.04 KB, 40 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA

TIỂU LUẬN MÔN HỌC
LẬP TRÌNH MẠNG
Đề tài:
LẬP TRÌNH BẰNG CÁC PHƯƠNG PHÁP PHÂN
TÁN ĐỂ ĐIỀU KHIỂN BÃI ĐỖ XE
Giáo viên hướng dẫn: PGS.TS Lê Văn Sơn
Hc viên thc hin:
+ Võ Văn Luận
+ Lê Văn Đông
Lớp: Khoa h5c máy tính - K11
Niên khoá: 2009- 2011
Đà Nng, 3 – 2010
MỤC LỤC
MỤC LỤC i
LỜI NÓI ĐẦU 1
CHƯƠNG 1: KHÁI QUÁT VỀ HỆ TIN HỌC PHÂN TÁN 2
1.1 Định nghĩa 2
1.2 Các thực thể trong hệ phân tán 2
1.3 Đặc điểm của hệ phận tán 2
1.4 Các ưu điểm của tài nguyên dùng chung trong hệ phân tán: 3
1.5 Các thao tác chuẩn của hệ phân tán 3
CHƯƠNG 2: BÀI TOÁN BÃI ĐỖ XE Ô TÔ 4
2.1 Phát biểu bài toán 4
2.1.1 Tình huống thứ 1 4
2.1.2 Tình huống thứ 2 5
2.2 Hướng giải quyết bài toán 5
2.3 Vấn đề cần giải quyết cho bài toán bãi đỗ xe 6
2.3.1 Giải quyết vấn đề 7


2.3.2 Thuật toán chương trình 9
CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH 12
3.1 Giới thiệu ngôn ngữ Java 12
3.1.1 Sơ lược về ngôn ngữ lập trình Java 12
3.1.2 RMI – Remote Method Invoke – và lập trình phân tán đối tượng 13
3.2 Nghiên cứu RMI trong Java 15
3.2.1 Bộ đăng ký (REGISTRY) 15
3.2.2 Trao đổi thông tin giữa các đối tượng 15
3.2.3 Tải xuống các lớp Bytecode cho đối tượng 16
3.3 Tiến trình xây dựng chương trình 17
3.3.1 III.3.1. Xây dựng chương trình Server 18
3.3.2 Xây dựng chương trình Client 23
3.3.3 Tải xuống mã động sử dụng RMI 24
3.3.4 Các lớp và giao diện trong ứng dụng RMI 25
3.4 Triển khai chương trình 31
3.4.1 Triển khai chương trình Server 32
3.4.2 Triển khai chương trình Client 33
3.5 Thực hiện chương trình 34
3.5.1 Khởi động các server 34
3.5.2 Thực hiện các yêu cầu từ các server 35
KẾT LUẬN 36
Kết quả thực tế đạt được 36
Tính khả thi và ưu điểm của chương trình 36
Hạn chế của chương trình 36
Hướng phát triển của đề tài 36
i
TÀI LIỆU THAM KHẢO 37
ii
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
LỜI NÓI ĐẦU

Ngày nay, công nghệ mạng máy tính và Internet đã phát triển mạnh, cho
phép chúng ta khai thác các nguồn tài nguyên là những kho tư liệu vô cùng rộng
lớn về các lĩnh vực, và được bố trí ở những nơi rất xa nhau.
Đối với các hệ thông tin lớn, dữ liệu không chỉ được lưu trữ và quản lý bởi
các Server độc lập mà thường được phân tán trên nhiều Server và phân bổ ở các
vị trí địa lý khác nhau. Hệ thống cho phép xử lý đa truy cập đồng thời cho phép
đăng ký từ xa. Một trong những lợi ích của việc phân tán dữ liệu như vậy là
nhằm chia yêu cầu xử lý dữ liệu cho nhiều máy nhằm tăng năng lực xử lý thông
tin của hệ thống.
Môn học Lập Trình Mạng dưới sự giảng dạy của PGS.TS Lê Văn Sơn,
nhóm chúng em đã hiểu thêm được tầm quan trọng, những kiến thức mới của
môn học. Vì vậy nhóm em đã chọn tiểu luận “Lập trình bằng các phương pháp
phân tán để điều khiển bãi đỗ xe” với các nội dung:
• Phân tích bài toán bãi đỗ xe ở mức có thể lập trình được;
• Liên hệ với các đặc điểm của hệ phân tán;
• Hiện lên màn hình dòng xe vào – ra tại mỗi trạm của người bảo vệ;
• Cho phép sử dụng phương án lý tưởng.
Mặc dù nhóm chúng em đã cố gắng tìm hiểu, nghiên cứu nhưng do thời
gian có hạn, khả năng cũng còn hạn chế nên nhóm không tránh khỏi những thiếu
sót. Kính mong thầy xem xét, góp ý để nhóm chúng em hoàn thiện, hiểu rõ hơn
nữa về công nghệ lập trình mới và tiên tiến này.
Xin chân thành cảm ơn !
Võ Văn Luận – Lê Văn Đông 1
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
CHƯƠNG 1: KHÁI QUÁT VỀ HỆ TIN HỌC PHÂN
TÁN
1.1 Định nghĩa
Hệ tin học phân tán hay nói ngắn gọn là hệ phân tán (Distributed System)
là hệ thống xử lý thông tin bao gồm nhiều bộ xử lý hoặc bộ vi xử lý nằm tại các
vị trí khác nhau được liên kết với nhau thông qua phương tiện viễn thông dưới

sự điều khiển thống nhất của một hệ điều hành.
1.2 Các thực thể trong hệ phân tán
Hệ phân tán gồm 4 thực thể:

Hình 1-1: Bốn thực thể của hệ tin học phân tán
1.3 Đặc điểm của hệ phận tán
Đặc điểm cần nhấn mạnh của hệ là các hệ xử lý thông tin thành phần:
• Không dùng chung hoặc chia sẻ bộ nhớ;
• Không sử dụng chung đồng hồ xung nhịp;
• Chúng liên lạc với nhau thông qua mạng truyền thông;
• Mỗi hệ xử lý có bộ xử lý, bộ nhớ và hệ điều hành riêng của nó.
Võ Văn Luận – Lê Văn Đông 2
Các hệ
thống
phần
mềm
Các hệ
thống
phần
mềm
Tập
hợp
phần
cứng
Tập
hợp
phần
cứng
Hệ
thống

truyền
thông
Hệ
thống
truyền
thông
Hệ
thống
dữ liệu
Hệ
thống
dữ liệu
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
Thành phần của hệ phân tán bao gồm các hệ thống cục bộ trong đó mỗi
một hay nhiều hệ thống phát các yêu cầu thông tin còn các hệ khác trả lời các
yêu cầu có liên quan đến phần dữ liệu của mình. Nói một cách tổng quát là trong
hệ luôn luôn diễn ra việc thực hiện các công việc do các hệ thống yêu cầu. Các
hệ thống truyền thống như hệ rời rạc hay tập trung không thể đáp ứng nhanh
chóng và chính xác các yêu cầu thông tin từ xa với lưu lượng thông tin lớn.
1.4 Các ưu điểm của tài nguyên dùng chung trong hệ phân tán:
Việc định nghĩa tài nguyên dùng chung mang đến cho hệ phân tán những
hiệu năng tốt trong khai thác ứng dụng như:
• Tăng tốc độ bình quân trong tính toán xử lý.
• Cải thiện tình trạng luôn sẵn sàng của các loại tài nguyên.
• Tăng độ an toàn cho dữ liệu.
• Đa dạng hóa các loại hình dịch vụ tin học.
• Bảo đảm tính toàn vẹn của thông tin.
Tuy nhiên nó cũng dẫn đến hàng loạt các vấn đề khó khăn trong việc thiết
lập hệ liên quan việc cấp phát tài nguyên dùng chung cho các tiến trình.
Điều quan trọng là để đảm bảo các chức năng, yêu cầu nêu ra trên, hệ tin

học phân tán cần phải có các cơ chế kỹ thuật đủ mạnh nhằm đồng bộ hóa hoạt
động của các tiến trình và sự trao đổi thông tin với nhau sao cho hệ thống tránh
được các trường hợp có thể dẫn đến bế tắc.
1.5 Các thao tác chuẩn của hệ phân tán
• Tiếp nhận và ghi yêu cầu chỉ dẫn.
• Dịch yêu cầu để có các thông tin cần thiết. Thực hiện một số công việc
của hệ thống cục bộ như kiểm tra quyền truy cập thông tin, lập hóa đơn
dịch vụ.
• Gửi kết quả cho hệ thống đã phát yêu cầu.
Võ Văn Luận – Lê Văn Đông 3
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
CHƯƠNG 2: BÀI TOÁN BÃI ĐỖ XE Ô TÔ
2.1 Phát biểu bài toán
Bài toán bãi đỗ xe được phát biểu như sau:
Cho một bãi đỗ xe ô tô N chỗ và có ít nhất là hai lối vào. Hành vi của ô tô
là: Vào bãi (vao), đỗ (d), Ra (ra).
Hình 2-1 mô phỏng bãi để xe ô tô hiện đại. Trong đó BV - người bảo vệ có
nhiệm vụ phân phối chỗ cho các xe ô tô, VT - vị trí cho từng xe ôtô cụ thể. Các
mũi tên hai chiều được sử dụng để mô tả dòng vào ra của ô tô.
2.1.1 Tình huống thứ 1
Ta giả sử rằng bãi đỗ xe ô tô là một bãi lớn có một cổng vào dưới sự kiểm
soát của người bảo vệ (BV) duy nhất. Người bảo vệ chỉ biết được một phần
trạng thái của bãi để xe. Trong khi anh ta nghĩ rằng bãi xe đã bị đầy, khi đó có
nhiều lái xe đang cho xe chạy ra cổng. Vì suy nghĩ như vậy, trong trường hợp
này, anh ta không giải quyết cho các xe khác tiếp tục vào bãi nữa, mặc dù lúc
Võ Văn Luận – Lê Văn Đông 4
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
này trong bãi đang có chỗ trống. Như vậy, người bảo vệ không nắm được trạng
thái hiện hành của bãi.
2.1.2 Tình huống thứ 2

Nếu ta có bãi để xe với nhiều cổng vào và tại mỗi cổng vào có một người
bảo vệ thì mỗi người bảo vệ chỉ có thể biết được trạng thái với độ trễ nhất định
và điều đó dẫn đến tình huống thứ 2. Đó là tình huống có nhiều trung tâm ra
quyết định.
Trên thực tế một người bảo vệ tin rằng không còn chỗ trống nữa, trong khi
người bảo vệ khác lại vừa mới cho ra khỏi bãi một số xe mà anh ta chưa kịp báo
cho các người bảo vệ giải quyết các xe vào cùng một vị trí trong bãi do vì nhiều
thiếu thông tin.
Như vậy, các bảo vệ phải hợp lực với nhau để phân phối chính xác các chỗ
trong bãi, đặc biệt số lượng chỗ còn trống càng ít thì vai trò của hợp lực càng
quan trọng.
2.2 Hướng giải quyết bài toán
Ở đây sử dụng thuật toán loại trừ tương hổ để giải quyết yêu cầu của bài
toán. Nguyên lý của phương pháp này được khái quát như sau:
• Một tiến trình nào đó gửi thông điệp để yêu cầu sử dụng tài nguyên, một
tiến trình sử dụng xong tài nguyên nào đó truyền một thông tin giải
phóng khi nó ngừng chiếm dụng.
• Trong các hệ phân tán, chương trình cung cấp nằm trên một trạm và các
tiến trình đề nghị lại ở trên các trạm khác, các yêu cầu và khuyến nghị
giải phóng được truyền cho các chương trình cung cấp thông qua hình
thức thông điệp, chuyển theo các kênh của hệ thống viễn thông. Chính
vì vậy nhu cầu sắp xếp các yêu cầu này theo một trật tự nhất định nào
đó luôn luôn được đặt ra.
Võ Văn Luận – Lê Văn Đông 5
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
• Nếu chỉ có một thông điệp đến chương trình cung cấp thì trật tự đến thể
hiện một trật tự chặt chẽ. Ngược lại nếu có nhiều thông điệp đến cùng
một lúc thì việc sắp xếp chúng phải theo kiểu loại trừ trương hỗ trong
hàng đợi cục bộ của trạm có chứa chương trình cung cấp. Điều đó cũng
cho phép ta có được một trật tự chặt chẽ.

• Trật tự có được tại trạm cung cấp có thể không giống như trật tự phát,
nếu thời gian truyền không được cố định. Trường hợp này khá phổ biến
trong mạng máy tính. Nhưng nếu ta muốn xử lý các thông điệp theo
trình tự không tính tới thời gian truyền, thì cần phải tính đến một trật tự
tổng quát của các lần truyền thông điệp từ các trạm khác nhau.
2.3 Vấn đề cần giải quyết cho bài toán bãi đỗ xe
Không có hai tiến trình truy cập cùng một tài nguyên cùng một thời điểm.
Bất kỳ tiến trình nào muốn truy cập tài nguyên thì cuối cùng cũng truy cập được
tài nguyên đó. Ngoài ra, chúng ta yêu cầu mỗi tiến trình phải tuân theo thêm hai
đặc điểm sau:
• Mỗi tiến trình nên yêu cầu tài nguyên theo một trình tự và liên tục, bắt
đầu và kết thúc tại một vài tài nguyên duy nhất nào đó mà các tài
nguyên này được tiến trình tự chọn.
• Bất kỳ một tiến trình mà dành được tất cả các tài nguyên mà nó muốn,
cuối cùng cũng phải giải phóng tất cả tài nguyên đó.
Có hai sự khó khăn đáng kể là bài toán phải giải quyết: Số lượng các tiến
trình tham gia thì không được biết giữa các tiến trình và cũng không biết được
số lượng tài nguyên được chia sẻ.
Chúng ta trước hết hãy quan sát tình huống như sau, không có bất kỳ sự
ràng buộc thêm, bất kỳ tình huống các tiến trình chờ đợi lẫn nhau, bài toán chỉ
có duy nhất một tiến trình đơn ở một thời điểm điều khiển vị trí để xe.
Vấn đề đặt ra đó là bài toán không cho phép bất kỳ giải pháp mô hình bất
đồng bộ thuần tuý. Điều không thể xuất phát theo một sự suy diễn mà không
Võ Văn Luận – Lê Văn Đông 6
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
biết được tập hợp các tiến trình tham gia. Thật vậy, trong mô hình bất đồng bộ
khi các messages có thể chiếm một thời gian dài tuỳ tiện trước khi phát đi, một
tiến trình không có cách nào biết các tiến trình xung quanh nó.
2.3.1 Giải quyết vấn đề
Cho một bãi đỗ xe ô tô N chỗ và có ít nhất là hai lối vào. Hành vi của ô tô

là: vào bãi (vào), đỗ (do), Ra (ra).
Việc quản lý truy cập bao gồm ghi lại số lượng xe vào E, số lượng xe ra S
và kiểm tra X mỗi khi muốn cho xe vào bãi theo công thức:
X = N – E + S > 0
Trong hệ thống này, người ta sử dụng bộ điều khiển C
i
để có được số lượng
vào chính xác là E
i
, số lượng ra là S
i
. Cho biết M là số lượng bộ điều khiển có
trong hệ. Người ta muốn trang bị cho mỗi C
i
một biến X
i
- số lượng chỗ còn
trống trong bãi nhằm mục đích có thể sử dụng điều kiện cục bộ:
X
i
> 0
Để giải quyết bài toán trên, một người bảo vệ có vai trò như là chương
trình cung cấp chỗ của bãi để xe ô tô. Chỗ để xe được xem như là tài nguyên của
hệ. Giả sử rằng ở thời điểm cho trước ta có 4 người bảo vệ và có 100 chỗ còn
trống. Tất cả đều có thông tin đó. Trạng thái của hệ lúc này là gắn bó. Ba trong
số họ phát đi thông tin như sau :
STT Ký hiệu Thông tin phát đi
1 M1 Thêm 20 chỗ trống
2 M2 Đã có 10 chỗ bị chiếm
3 M3 Dành 10% chỗ trống để quét dọn sân bãi

Bảng 2-1: Thông tin phát đi
Bảng trên cho ta thấy, nếu ta không thấy ràng buộc nào đối với trình tự xử
lý các thông điệp nhận được của các người bảo vệ thì các người bảo vệ này sẽ có
Võ Văn Luận – Lê Văn Đông 7
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
số lượng chỗ trống khác nhau. Để bảo đảm các bảng cập nhật khác nhau thì trình
tự cập nhật nhất thiết phải giống nhau trên tất cả các trạm.
Trật tự
xử lý
Bảo vệ 1 Bảo vệ 2 Bảo vệ 3 Bảo vệ 4
Thông
điệp
Giá
trị
Thông
điệp
Giá
trị
Thông
điệp
Giá
trị
Thông
điệp
Giá trị
100 100 100 100
1 M1 120 M1 120 M3 90 M2 90
2 M3 108 M2 110 M1 110 M3 81
3 M2 98 M3 99 M2 100 M1 101
Bảng 2-2: Trật tự các thông điệp gửi đến từ các trạm

Từ kết quả trên, ta thấy rằng nếu trật tự các thông điệp đến với các người
bảo vệ không giống nhau thì số lượng chỗ trống của bãi đỗ xe ở mỗi nguời bảo
vệ ở một thời điểm là không giống nhau. Vì ta xem một người bảo vệ như là một
chương trình cung cấp chỗ để xe của bãi, các chương trình này nằm trên các
trạm khác nhau cách nhau về mặt địa lý. Do đó trật tự các thông điệp đến các
trạm là khác nhau và vì vậy kết quả thể hiện trên các chương trình là không
giống nhau. Điều này thể hiện sự không gắn bó giữa các chương trình. Để cho
các kết quả trên các trạm là giống nhau thì các thông điệp đến các trạm theo một
trật tự giống nhau.
Điều này xảy ra trên các hệ tập trung. Đối với hệ phân tán chúng ta phải
xây dựng thuật toán cung cấp cho hệ tin học phân tán.
Một sự hoạt động gắn bó của các chương trình cung cấp phân tán quản lý
trên cùng một tập hợp các tài nguyên chỉ đạt được nếu tuân thủ các quy tắc sau,
ở đây các thông điệp được hiểu là các yêu cầu hay khuyến nghị giải phóng tài
nguyên.
STT
Quy tắc
1
Các bộ cung cấp phải thực hiện cùng một giải thuật
2
Các bộ cung cấp đều nhận tất cả các thông điệp phát đi từ các
tiến trình
Võ Văn Luận – Lê Văn Đông 8
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
3
Các thông điệp phải được xử lý cùng một trật tự như nhau trong
các chương trình cung cấp.
Bảng 2-3: Các quy tắc
Quy tắc sau cùng nhấn mạnh đến sự thiết yếu phải có một trật tự duy nhất
trên tập hợp các thông điệp của hệ. Trật tự này có thể được thực hiện thông qua

việc hợp lực giữa các tiến trình cung cấp hay giữa các tiến trình phát thông điệp.
Chiến lược hợp lực giữa các tiến trình phát nhằm phân phối cho mỗi thông điệp
một dấu nhằm dựa vào đó ta có thể xác lập một trật tự hoàn toàn.
2.3.2 Thuật toán chương trình
Đóng dấu là hành vi gán giá trị nguyên cho một thông điệp nhằm ghi nhận
thời điểm truyền trên cơ sở tham chiếu đồng hồ logic.
Nội dung cơ bản của phương pháp này là trạm phát được gắn một giá trị
gọi là dấu. Giá trị này có tính chất thời điểm cho trạm phát thông tin và dựa vào
đồng hồ lô gíc cục bộ của chính trạm. Các đồng hồ này được lấy lại thông qua
hội thoại giữa các trạm.
Giải thuật Lamport loại trừ tương hỗ trên cơ sở đóng dấu: Thuật toán này
được Lamport (1978) đưa ra, nó sử dụng cơ chế đóng dấu thời gian cho việc
đồng bộ các đồng hồ lôgic.
a) Các giả định
Chúng ra giả định mô hình mạng kết nối hoàn toàn trong đó các tiến trình
liên lạc thông qua các kênh FIFO tin cậy. Tức là, các thông điệp không thể sắp
xếp lại theo trật tự khác.
Các giả định được thực thi một cách dễ dàng ở tầng giao vận.
b) Các kiểu thông điệp
(REQ, C
i
, i) : Một yêu cầu cho việc truy cập vào miền găng CS của tiến
trình Pi. Yêu cầu này được phát đi cho tất các các tiến trình khác.
Võ Văn Luận – Lê Văn Đông 9
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
(REP, C
i
, i) : Hồi âm từ tiến trình Pi cho tiến trình Pj khi Pi nhận được yêu
cầu từ Pj.
(REL, C

i
, i) : Thông điệp giải phóng từ Pi thông báo cho biết nó đã rời khỏi
CS. Thông điệp này được gửi cho tất cả các tiến trình khác.
c) Các biến tiến trình
• C
i
: Đồng hồ cục bộ của Pi, khởi tạo từ 0.
• q
i
: Hàng đợi [0 … n-1] chứa các thông điệp.
d) Thuật toán
Khi một tiến trình tại trạm S
i
muốn thi hành đoạn găng, nó sẽ gửi thông
điệp REQ có đánh dấu thời gian cho tất cả các trạm trong hệ thống kể có trạm S
i
.
Mỗi trạm, S
i
, duy trì một hàng đợi chứa các thông điệp yêu cầu được sắp
xếp theo trật tự các dấu thời gian; các đồng hồ logic và quan hệ trật tự toàn bộ
được sử dụng để gắn các dấu thời gian.
Khi một trạm nhận được yêu cầu, nó sẽ đưa thông điệp đó vào hàng đợi
yêu cầu của nó theo thứ tự dấu thời gian và gửi một thông điệp trả lời REP. Nếu
cần, quan hệ trật tự toàn bộ được sử dụng để phá vỡ các sự ràng buộc.
Ý tưởng chung là một tiến trình không thể thi hành đoạn găng của nó cho
đến khi nó nhận được trả lời từ tất cả các trạm khác.
Tóm lại, một trạm thi hành miền găng của nó khi:
• Nhận được thông điệp trả lời từ tất cả các trạm còn lại và
• Yêu cầu REQ của nó là ở trên đỉnh của hàng đợi cục bộ của nó.

Khi một trạm hoàn thành miền găng của nó, nó sẽ gửi khuyến nghị giải
phóng REL đến tất cả các trạm. Yêu cầu của nó được loại khỏi tất cả các hàng
đợi tại thời điểm này. Nếu các trạm khác đang chờ để thi hành miền găng của
chúng, một trong các trạm đó bây giờ có thể bắt đầu thực hiện miền găng của
mình.
Võ Văn Luận – Lê Văn Đông 10
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
e) Nhận thấy
Hoạt động: 3(N-1) thông điệp cần thiết cho mỗi miền găng được thi hành.
(N-1) thông điệp REQ, (N-1) thông điệp REP và (N-1) thông điệp REL.
Độ trễ đồng bộ: T (trong đó T thời gian trung bình truyền thông điệp). Khi
nhận được thông điệp giải phóng, tiến trình tiếp theo có thể bắt đầu thi hành.
Loại trừ tương hỗ là đạt được: Các dấu thời gian là duy nhất, vì vậy tất cả
các hàng đợi sẽ giữ các yêu cầu trong cùng một thứ tự. Chỉ một tiến trình duy
nhất sẽ nằm ở đỉnh của các hàng đợi.
Không đổi: Các yêu cầu được cấp quyền dựa trên cơ sở của trật tự dấu thời
gian và các tiến trình gửi các thông điệp REL.
Võ Văn Luận – Lê Văn Đông 11
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH
3.1 Giới thiệu ngôn ngữ Java
Ngôn ngữ xây dựng chương trình là ngôn ngữ Java, với việc sử dụng các
đối tượng phân tán bằng kĩ thuật RMI trong Java.
3.1.1 Sơ lược về ngôn ngữ lập trình Java
Java khởi thủy tên là Oak- là cây sồi mọc ở phía sau văn phòng của nhà
thiết kế chính ông Jame Gosling, sau này ông thấy rằng đã có ngôn ngữ lập trình
tên Oak rồi, do vậy nhóm thiết kế quyết định đổi tên, và “Java” là cái tên được
chọn, Java là tên của một quán Cafe mà nhóm thiết kế Java hay đến đó uống.
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. 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
Võ Văn Luận – Lê Văn Đông 12
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
đượ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.
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, robo
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)
Tính uyển chuyển của ngôn ngữ Java thể hiện qua việc chương trình biên
dịch Java chuyển đổi chương trình nguồn Java thành mã đối tượng, gọi là mã
byte (bytecodes) - tập tin có tên quy ước với phần mở rộng là .class. Sau đó,
máy ảo Java có trên máy điều khiển để thực thi.
Mã máy chỉ thực hiện trên máy tính mà nó được biên dịch, trong khi
bytecode có thể thực hiện trên bất kỳ hệ thống máy tính nào có trình điều khiển
Java. Ngoài ra, tính uyển chuyển làm tăng khả năng tái sử dụng các lớp được tạo
ra; các lớp cho phép thực hiện kỹ thuật kết nối động (Dynamic Binding) khi
chương trình thực thi.
3.1.2 RMI – Remote Method Invoke – và lập trình phân tán đối tượng
Thông thường các chương trình được viết dưới dạng thủ tục hay hàm gọi.
Mã lệnh của hàm hay thủ tục được nạp thẳng vào ký ức và thực thi ngay trên
máy cục bộ. Đối với các hàm (hoặc đối tượng) thư viện như
Võ Văn Luận – Lê Văn Đông 13
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
System.out.println(), bạn không cần quan tâm đến cách thức mà hàm thư viện
này cài đặt. Điều quan tâm ở đây là đối số truyền cho hàm và kết quả trả về. Vậy
thì có cách nào nạp nội dung của hàm hay đối tượng ở một máy nào đó và gọi
chúng từ một máy hay không? Đây chính là nội dung của lập trình phân tán mã
lệnh. RMI - mang ý nghĩa triệu gọi phương thức từ xa - là cách thức giao tiếp
giữa các đối tượng Java có mã lệnh cài đặt (bao gồm phương thức và thuộc tính)
nằm trên các máy khác nhau có thể triệu gọi lẫn nhau.
Hình 3-1 cho thấy mô hình triệu gọi đối tượng phân tán. Trên máy A các
đối tượng A1, A2 gọi phương thức của nhau được gọi là triệu gọi phương thức
cục bộ (local method invoke) đây là cách mà lập trình hướng đối tượng truyền
thống vẫn sử dụng. Tương tự, tương tác giữa C1, C2, C3 là tương tác cục bộ.
Tuy nhiên, đối tượng Java có thể gọi phương thức của đối tượng nằm trên
một máy khác dự vào giao thức triệu gọi từ xa RMI thông qua lớp trung gian:

stub (lớp móc) - máy khách; skeletion (lớp nối) - máy khách. Ví dụ như A1 gọi
C1 (Trình biên dịch Java sẽ giúp bạn tạo 2 lớp trung gian C1_Skel và C1_Stub,
kết quả trả về sẽ được C1_Skel đóng gói trả ngược lại cho C1_stub. C1_Stub sẽ
chuyển giao kết quả trả về cho A1), tương tự A2 gọi B1.
Võ Văn Luận – Lê Văn Đông 14
Computer A
Computer B
A2
A1
C1_stub
B1_stub
B1_skel
B
1
C1_skel
C
1
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
Hình 3-1: Gọi phương thức thông qua lớp trung gian
3.2 Nghiên cứu RMI trong Java
Tiến trình thực hiện các ứng dụng phân tán sử dụng kỹ thuật này nói chung
gồm các bước sau:
3.2.1 Bộ đăng ký (REGISTRY)
Một Client muốn sử dụng các phương thức và gọi được đối tượng từ xa thì
Client đó phải liên lạc với rmiregistry để lấy về tham chiếu đối tượng. Dịch vụ
đăng ký và truy tìm đối tượng được Java quản lý bằng các hàm giao tiếp JNDI
(Java Naming Directory Interface). Các hàm JNDI ở máy khách
(Naming.lookup()) sẽ liên lạc với rmiregistry để nhận về tham chiếu đối tượng.
Trong khi các hàm JNDI ở máy chủ (Naming.bind() hoặc Naming.rebind()) có
nhiệm vụ đăng ký tên đối tượng với rmiregistry.

Mục đích của các ứng dụng RMI là lập trình phân tán đối tượng trên mô
hình kết nối mạng.
3.2.2 Trao đổi thông tin giữa các đối tượng
Trao đổi thông tin giữa các đối tượng ứng dụng kỹ thuật RMI trên thực
chất là quá trình xây dựng những tham chiếu từ xa giữa các đối tượng, một khi
đạt được sự tham chiếu này các đối tượng từ xa có thể gọi ra các phương thức
của nhau cho dù nội dung đoạn mã có thể phân tán tại các Client hoặc một
Server nào đó. Việc trao đổi thông tin từ xa này đã được xem như một tiêu
chuẩn trong việc gọi ra các phương thức trong Java.
Việc nạp các lớp thao tác mã (bytecode) cho các đối tượng thực chất là
chuyển đi các tham số hoặc giá trị trả về. RMI cho phép nơi gọi chuyển hoàn
toàn các đối tượng Java đến các đối tượng từ xa, RMI cung cấp các kỹ thuật cần
thiết cho việc nạp mã của các đối tượng từ xa cũng như chuyển dữ liệu của nó.
Trong phạm vi ứng dụng này đã sử dụng một trình đăng ký để có được các tham
chiếu đến các đối tượng từ xa. Server gọi trình đăng ký để liên kết tên với đối
Võ Văn Luận – Lê Văn Đông 15
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
tượng từ xa. Client tìm kiếm đối tượng từ xa thông qua tên của nó trong trình
đăng ký của Server và gọi ra phương thức trên đó.
Tiến trình nạp các lớp bytecode sử dụng một trang web Server để trao đổi
thông tin từ Server đến Client và ngược lại cho các mục đích khác nhau của các
đối tượng.
RMI có thể nạp các lớp bytecode bằng cách sử dụng bất kỳ giao thức URL
nào (HTTP, FTP, file, v.v.) được hệ thống java cung cấp.
3.2.3 Tải xuống các lớp Bytecode cho đối tượng
Bởi vì RMI cho phép một chương trình gọi nhận được các phương thức của
đối tượng để phục vụ cho các đối tượng từ xa, để thực hiện được điều đó RMI
cung cấp một kỹ thuật cần thiết cho việc nạp mã của các phương thức thuộc đối
tượng khá tốt cũng như việc truyền dữ liệu của nó. Theo mô hình minh họa bằng
hình ảnh của một ứng dụng RMI có sử dụng trình đăng ký (registry) để đạt được

khả năng tham chiếu đến các đối tượng từ xa. Trước Server gọi ra trình đăng ký
registry để liên kết tên của các đối tượng từ xa. Sau đó
Client tìm kiếm đối tượng từ xa bằng tên của nó đã đăng ký trên Server và
gọi ra các phương thức trên đối tượng đó. Sự minh họa này cũng chỉ ra rằng hệ
thống RMI sử dụng một Web Server đang hoạt động để nạp các lớp mã
bytecode từ Server đến phục vụ cho những yêu cầu của Client và ngược lại cho
các đối tượng khi cần.
Tất cả các hoạt động nói trên có thể được mô tả như hình sau.
Võ Văn Luận – Lê Văn Đông 16
Client
Client

Server

Server
Registr
y
Web
Server
Web
server
RMI
RMI
URL protocol
URL protocol
URL protocol
RMI
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
Hình 3-2: Mô hình tổng quan của ứng dụng RMI
3.3 Tiến trình xây dựng chương trình

Các bước tiến hành:
a) Thiết kế và bổ sung các công cụ cho ứng dụng
Trước tiên phải quyết định kiến trúc của ứng dụng và quyết định những
thành phần nào là những đối tượng cục bộ và cái nào là có thể được truy cập từ
xa. Bao gồm các bước sau:
Định nghĩa các giao din từ xa: Một giao diện từ xa định rõ các phương
thức nào có thể được gọi ra từ các Client ở xa. Chương trình Client hướng đến
các giao diện từ xa không đến các phần bổ sung lớp của các giao diện này. Phần
thiết kế giao diện là quyết định bất kỳ đối tượng cục bộ nào sẽ được sử dụng như
các tham số và trả về giá trị cho các phương thức này, nếu các giao diện hoặc
các lớp chưa có thì ta cần định nghĩa chúng.
Bổ sung các đối tượng từ xa: Các đối tượng từ xa phải thuộc một hoặc
hơn một giao diện từ xa nào đó. Lớp bổ túc cho đối tượng từ xa phải được kèm
theo phần bổ sung của các giao diện khác (hoặc cục bộ hoặc từ xa) và các
phương thức khác (chỉ những phương thức cục bộ có sẵn). Nếu bất kỳ lớp cục
bộ nào được sử dụng như là các tham số hoặc giá trị trả về cho các phương thức
này thì chúng phải được bổ sung thêm.
Các Client sử dụng các đối tượng từ xa có thể được bổ sung tại bất kỳ thời
điểm nào sau khi các giao diện đã được định nghĩa, kể cả sau đó các đối tượng
từ xa bị hủy bỏ.
b) Biên dịch nguồn và sản sinh các Stub
Đây là bước thứ hai của tiến trình, trong bước đầu tiên ta sử dụng trình biên
dịch javac để biên dịch các tệp nguồn *.java trong đó có chứa các phần phụ của
giao diện từ xa, phần phụ của các lớp Server và các lớp Client. Trong bước thứ
Võ Văn Luận – Lê Văn Đông 17
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
hai này ta sử dụng trình biên dịch rmic để tạo các Stub cho các đối tượng ở xa.
RMI sử dụng lớp Stub của đối tượng từ xa tương tự như là một sự ủy quyền
trong Client để mà Client có thể trao đổi thông tin với một đối tượng riêng biệt.
c) Xây dựng các lớp có thể truy cập mạng

Trong bước này ta làm các việc sau: Liên kết các tệp *.class với các giao
diện từ xa, các lớp Stub và các lớp khác cần được tải xuống cho các công việc ở
chương trình Client. Tất cả đều được truy cập thông qua một Web Server.
d) Khởi động ứng dụng
Khởi động ứng dụng bao gồm việc chạy chương trình đăng ký đối tượng
RMI từ xa, chương trình Server và Client.
3.3.1 III.3.1. Xây dựng chương trình Server
Chương trình Server RMI chấp nhận các thông tin từ các Client, xử lý
thông tin và trả lại các kết quả cho các Client. Chương trình Server nói chung
bao gồm ít nhất một Interface và một Class. Giao diện (Interface) cung cấp các
định nghĩa cho các phương thức mà từ đó có thể được gọi từ các Client. Về bản
chất thì các giao diện này định nghĩa cách nhìn các đối tượng từ xa của các
chương trình Client. Lớp (Class) cung cấp các thành phần công cụ bổ sung.
Việc thiết kế Server RMI gồm các bước sau :
+ Thiết kế một giao diện từ xa: Phần này sẽ mô tả giao diện chính, nó cung
cấp sự kết nối giữa Client và Server. Mục đích là để thiết đặt một môi trường
trao đổi thông tin giữa Client và Server.
Phần quan trọng nhất của Server RMI là tạo một giao thức để nó cho phép
các Client được đệ trình công việc đến Server RMI, sau đó thực hiện mọi thông
tin nhận được và trả kết quả về cho Client. Giao thức này được biểu diễn trong
các Interface và được cung cấp bởi Server RMI, các đối tượng được phép đệ
trình đến Server RMI có thể được trình bày như mô hình sau:
Võ Văn Luận – Lê Văn Đông 18
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
Hình 3-3: Mô hình các đối tượng đệ trình đến Server
Mỗi giao diện chứa một phương thức đơn. Cụ thể giao diện ParkingServer
cho phép các công việc được đệ trình đến Server, định nghĩa làm thế nào Server
RMI thực hiện công việc thu nhận các đệ trình từ chương trình
ParkingClientImpl.
Ngoài ra giao diện của Server RMI còn định nghĩa các thành phần có thể

truy cập từ xa đến bản thân nó.
Đoạn mã cài đặt giao diện như sau :
import java.rmi.*;
public interface ParkingServer extends Remote{
public String getdata() throws RemoteException;
public void register(ParkingClient c) throws
RemoteException;
public void updateSeats(String s) throws RemoteException;
public String getTitle() throws RemoteException;
}
Với phần mở rộng của Interface là java.rmi.Remote, giao diện này khẳng
định các phương thức của nó có thể được gọi từ bất kỳ máy ảo java nào. Bất kỳ
đối tượng nào bổ sung cho giao diện này đều trở thành đối tượng từ xa.
Là một thành phần tất yếu của giao diện từ xa, các phương thức từ xa được
khai báo trong giao diện này phải có thành phần mở rộng trong mệnh đề throws
là java.rmi.RemoteException. Ngoại lệ này tung ra bởi hệ thống RMI trong suốt
quá trình gọi phương thức từ xa để quyết định hoặc là quá trình trao đổi thông
tin hỏng hoặc lỗi về giao thức đã xuất hiện. RemoteException là một ngoại lệ
kiểm tra vì thế bất kỳ đoạn mã nào gọi đến một phương thức từ xa cần xử lý
ngoại lệ này bằng cách hoặc bắt nó hoặc khai báo nó trong mệnh đề throws.
Võ Văn Luận – Lê Văn Đông 19
Client
Server RMI
Đệ trình công việc
Kết quả trả về
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
+ Xây dựng Server thành phần: Phần này sẽ thống kê các lớp bổ sung cho
giao diện chính, bằng cách bổ sung một số đối tượng từ xa. Lớp này cũng cung
cấp phần còn lại của mã xây dựng nên chương trình Server.
Một lớp của Server RMI. Lớp này được kiến tạo với những thành phần

sau :
• Khai báo các giao diện từ xa thành phần.
• Định nghĩa constructor cho đối tượng từ xa.
• Cung cấp phần bổ sung cho mỗi phương thức trong các giao diện từ xa.
Server cần tạo và cài đặt các đối tượng từ xa. Các thủ tục cài đặt có thể
đóng gói trong một phương thức main trong lớp bổ sung đối tượng từ xa, hoặc
nó có thể kèm theo trong một lớp trọn vẹn khác. Thủ tục cài đặt cần :
• Tạo ra và cài đặt một trình quản lý bảo mật.
• Tạo một hoặc hơn các đối số của đối tượng từ xa
Đăng ký ít nhất một đối tượng từ xa với trình đăng ký đối tượng từ xa RMI
cho mục đích phát triển sau này.
+ Phương thức main của Server:
Hầu hết các phương thức được gọi ra trong thành phần phụ
ServerParkingImpl là phương thức main. Phương thức main được sử dụng để
khởi động ParkingServerImpl vì vậy cần phải xây dựng một trình khởi tạo và
quản lý để chuẩn bị cho Server nhận các cuộc gọi từ các Client. Các phương
thức này không phải là một phương thức từ xa nghĩa là nó không thể được gọi từ
các máy ảo khác vì phương thức main được khai báo static nên nó không thể kết
hợp với một đối tượng nào.
+ Khai báo các giao diện từ xa thành phần:
Các lớp thành phần cho ParkingServerImpl được khai báo như sau:
public class ParkingServerImpl implements ParkingServer{ }
Võ Văn Luận – Lê Văn Đông 20
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
Khai báo tình trạng các lớp bổ sung cho giao diện từ xa (định nghĩa một đối
tượng từ xa) và lớp có phần mở rộng là: java.rmi.Server.UnicastRemoteObject.
UnicastRemoteObject là một lớp thuận tiện cho việc định nghĩa các thành
phần API của RMI, nó được sử dụng như là một siêu lớp cho các thành phần bổ
sung cho đối tượng từ xa. Siêu lớp UnicastRemoteObject cung cấp các thành
phần bổ sung cho một số phương thức java.lang.Object (equals, hashCode,

toString) các phương thức này sẽ được định nghĩa cho các phương thức từ xa.
UnicastRemoteObject cũng kèm theo các contructure và các phương thức tĩnh
được sử dụng để xuất đi một đối tượng từ xa, chúng sẽ được gọi vào từ các
Client.
Một đối tượng từ xa thành phần không phải mở rộng là
UnicastRemoteObject nhưng không phải bất kỳ thành phần nào cũng phải được
cung cấp từ phương thức java.lang.Object. Hơn thế nữa một đối tượng từ xa
thành phần phải làm một cuộc gọi đến một trong những phương thức của các đối
tượng đã xuất đi của UnicastRemoteObject để làm cho thời gian chạy RMI nhận
biết đối tượng từ xa để mà đối tượng có thể chấp nhận các cuộc gọi đến. Với
phần mở rộng UnicastRemoteObject lớp ParkingServerImpl có thể được sử
dụng để tạo các đối tượng từ xa có hỗ trợ trao đổi thông tin từ xa (điểm - điểm)
và sử dụng kiểu truyền tin mặc định của RMI là trên cơ sở các Socket.
+ Xây dựng đối tượng từ xa tương ứng với các Client:
Phương thức main là trường hợp riêng của ParkingServerImpl. Điều này
được thực hiện với câu lệnh :
ParkingServerImpl obj = new ParkingServerImpl();
Constructure gọi đến siêu lớp UnicastRemoteObject, trong các thành phần
trả về thì một đối tượng mới được tạo ra trong thời gian chạy RMI.
Một khi việc xuất đi đã được hoàn thành thì đối tượng từ xa
ParkingServerImpl đã sẵn sàng nhận các cuộc gọi từ Client trên một cổng đồng
bộ được RMI chọn hoặc dưới một hệ điều hành. Sự khai báo này nhấn mạnh
Võ Văn Luận – Lê Văn Đông 21
Báo cáo môn hc Lâp trình mạng Khoa hc máy tính – Khoá 11
rằng giao diện thích hợp với các Client là ParkingServerImpl và các phương
thức của nó.
Trước khi một cuộc gọi có thể gọi ra một phương thức trên một đối tượng
thì cuộc gọi đó phải thực hiện được một sự tham chiếu đến đối tượng từ xa. Điều
này tương tự như việc tham chiếu đến các đối tượng trong một chương trình
hoặc tương tự như các giá trị trả về của một phương thức hay sự tham chiếu nội

dung trong cấu trúc dữ liệu.
Hệ thống cung cấp một đối tượng từ xa đặc trưng đó là RMI registry dùng
để tìm kiếm các tham chiếu đến các đối tượng từ xa. RMI registry là tên một đối
tượng từ xa nó cho phép các Client tham chiếu đến các đối tượng từ xa thông
qua tên gọi của chúng. Registry đơn thuần được dùng để định vị các đối tượng
từ xa trước khi một Client RMI cần sử dụng đến, từ đối tượng này sẽ dẫn xuất
đến các đối tượng tiếp theo.
Giao diện java.rmi.Naming được sử dụng như một API đầu cuối cho tiến
trình kết nối, đăng ký và truy cứu các đối tượng từ xa trong registry. Một khi đối
tượng từ xa được đăng ký với RMI registry trên host cục bộ thì các trình gọi trên
bất kỳ host nào cũng có thể truy cứu các đối tượng từ xa theo tên và sử dụng các
tham chiếu của chúng. Registry có thể được chia sẻ cho tất cả các Server đang
chạy trên một host hoặc một Server có thể tạo riêng một registry cho mình.
Lớp ParkingServerImpl tạo ra một tên gọi cho đối tượng với câu lệnh :
Naming.rebind("rmi://" + hostName + "/XYZ", cs);
Tên này kèm theo tên máy chủ (127.0.0.1) mà trình đăng ký (và đối tượng
từ xa) đang chạy, tên ParkingServerImpl định rõ đối tượng từ xa đăng ký trong
registry, đối tượng này sẽ được tham chiếu tại chương trình Client. Đoạn mã sử
dụng để đăng ký tên với RMI registry đang chạy trên Server được thực hiện
trong một khối try như sau :
try {
UnicastRemoteObject.exportObject(cs);
Naming.rebind("rmi://127.0.0.1/XYZ", cs);
txttrangthai.append("Server da khoi dong.\n");
Võ Văn Luận – Lê Văn Đông 22

×