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

CHƯƠNG TRÌNH MÔ PHỎNG QUÁ TRÌNH HOẠT ĐỘNG CỦA 3 LOẠI THÔNG ĐIỆP CƠ BẢN REQ, ACQ VÀ REL TRONG HỆ TIN HỌC PHÂN TÁN

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 (706.5 KB, 27 trang )

Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
ĐẠ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:
CHƯƠNG TRÌNH MÔ PHỎNG QUÁ TRÌNH HOẠT
ĐỘNG CỦA 3 LOẠI THÔNG ĐIỆP CƠ BẢN REQ, ACQ
VÀ REL TRONG HỆ TIN HỌC PHÂN TÁN
Giáo viên hướng dẫn: PGS TS Lê Văn Sơn
Hc viên thc hin:
- Đoàn Ngọc Diễm
My
- Trần Thị Bích
Đào
Lớp : Khoa hc máy tính K11
Niên khoá : 2009- 2011
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 1
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
Đà N'ng, 03/2010
LỜI MỞ ĐẦ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:
+ Xây dựng hệ thống 3 Server thể hiện khả năng phát/nhận thông điệp.
+ Viết chương trình mô phỏng quá trình hoạt động của 3 loại thông điệp
cơ bản REQ, ACQ và REL trong hệ tin học phân tán.
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 !
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 2
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
MỤC LỤC
LỜI MỞ ĐẦU 1
1. Yêu cầu: 4
2. Giải thuật Loại trừ tương hỗ: 4
4. Kiểm nghiệm giải thuật: 6
Ta nhận thấy rằng: 7
5. Phản ứng với sự cố: 7
6. Kết luận: 7
KẾT LUẬN 26
TÀI LIỆU THAM KHẢO 27

Đoàn Ngọc Diễm My – Trần Thị Bích Đào 3
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
I. Yêu cầu và Giải thuật:
1. Yêu cầu:
+ Xây dựng hệ thống 3 Server thể hiện khả năng phát/nhận thông điệp.
+ Viết chương trình mô phỏng quá trình hoạt động của 3 loại thông điệp

cơ bản REQ, ACQ và REL trong hệ tin học phân tán.
2. Giải thuật Loại trừ tương hỗ:
Loại trừ tương hỗ có thể được thực hiện trên một trạm trung tâm có nhiệm
vụ nhận tất cả các thông điệp và khuyến nghị giải phóng. Trạm này duy trì một
hàng đợi, sắp xếp các yêu cầu theo trật tự đến và phục vụ cho từng thông điệp
một trong trật tự này.
Phân tán giải thuật này kéo theo việc phân tán các chức năng cung cấp mà
cần phải điều khiển hàng đợi trên trạm. Do vậy, một trạm chuyên cho việc nhận
các yêu cầu và khuyến nghị giải phóng trên tất cả các trạm còn lại. Một trật tự
giống nhau trên các trạm chỉ đạt được nếu ta áp dụng dấu trong các thông điệp
bởi các đồng hồ logic truyền và đánh số các trạm. Quan hệ trật tự toàn bộ được
định nghĩa, thêm vào đó, để cho một trạm có thể ra quyết định bằng việc tham
chiếu duy nhất vào hàng đợi của mình, nó còn cần phải nhận một thông điệp của
từng trạm khẳng định rằng không có thông điệp nào trước các thông điệp khác
mà còn đang quá cảnh trên đường.
Thuật toán Loại trừ tương hỗ có thể được mô tả như sau:
+ Trạm i của mạng có thể gửi thông điệp cho các trạm khác thông điệp có
dạng (T, H
i
, i), trong đó H
i
là dấu của thông điệp có nghĩa là đồng hồ logic của
nó và T có thể nhận một trong 3 giá trị REQ, REL, ACQ.
Ba giá trị này xác định bản chất của ba loại thông điệp khác nhau:
STT Thông điệp Giải thích
1 REQ
Thông điệp REQ được phát đi cho tất cả các trạm, khi
trạm i muốn vào trong đoạn găng
2 REL
Thông điệp REL được phát đi cho tất cả các trạm, khi

trạm i đã rời khỏi đoạn găng
3 ACQ
Thông điệp ACQ được gửi bởi trạm j cho trạm i, khi
trạm j đã nhận được từ trạm i thông điệp REQ
+ Mỗi trạm quản lý một hàng đợi các thông điệp được sắp xếp theo quan
hệ <thời gian, số> của từng thông điệp. Theo cấu trúc, hàng đợi luôn luôn chứa
một thông điệp và chỉ một thường trực trên mỗi trạm, bao gồm trạm cục bộ. Khi
có một thông điệp được gửi đi bởi trạm i, đồng thời nó cũng được ghi trong
hàng đợi của trạm này.
Giả sử rằng mỗi hàng đợi ban đầu chứa các thông điệp:
M
i
= (REL, H
init
, i)
Trong đó, i, H
init
là thời điểm khởi sự giống nhau cho tất cả các trạm
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 4
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
+ Trên mỗi trạm, khi nhận được một thông điệp dạng (REQ, H
i
, i) hay
(REL, H
i
, i), thông điệp này thay thế thông điệp M
i
bất chấp nó là gì. Khi nhận
thông điệp loại (ACQ, H
i

, i), thông điệp này thay thế M
i
ngoại trừ M
i
là một yêu
cầu mà trong trường hợp đó ACQ bị bỏ qua. Do vậy, ta có thể tiết kiệm việc gửi
thông điệp ACQ cho trạm i khi trạm này đã gửi một thông điệp REQ và không
còn thông điệp REL.
+ Trạm i được quyền vào đoạn găng khi thông điệp REQ của nó đến trước
theo nghĩa của quan hệ <thời gian, số> của tất cả các thông điệp khác trong hàng
đợi của nó.
3. Giải pháp cho vấn đề đoạn găng:
+ Khái niệm Tài nguyên găng: Những tài nguyên được hệ điều hành chia sẻ
cho nhiều tiến trình hoạt động đồng thời dùng chung, mà có nguy cơ dẫn đến sự
tranh chấp giữa các tiến trình này khi sử dụng chúng được gọi là tài nguyên
găng.
+ Tài nguyên găng có thể là tài nguyên phần cứng hoặc tài nguyên phần
mềm, có thể là tài nguyên phân chia được hoặc không phân chia được, nhưng đa
số thường là tài nguyên phân chia được như là: các biến chung, các file chia sẻ.
+ Ví dụ sau sẽ cho ta thấy rõ hơn việc sử dụng tài nguyên găng:
Giả sử có một chương trình, trong đó có hai tiến trình P1 và P2 hoạt động
đồng thời với nhau. Tiến trình P1 phải tăng biến Count lên 1 đơn vị, tiến trình
P2 phải tăng biến Count lên 1 đơn vị, với mục đích tăng Count lên được 2 đơn
vị.
Chương trình có thể thc hin như sau:
1. Tiến trình P1 ghi nội dung biến toàn cục Count vào biến cục bộ L1
2. Tiến trình P2 ghi nội dung biến toàn cục Count vào biến cục bộ L2
3. Tiến trình P1 thực hiện L1:= L1 + 1 và Count := L1
4. Tiến trình P2 thực hiện L2:= L2 + 1 và Count := L2
Như vậy thoạt nhìn ta thấy rằng chắc chắn Count đã tăng được 2 đơn vị,

nhưng trong thực tế có thể Count chỉ tăng được 1 đơn vị. Bởi vì, nếu P1 và P2
đồng thời nhận giá trị của Count (giả sử ban đầu Count = 4) vào L1 và L2, sau
đó P1 tăng L1 lên 1 và P2 tăng L2 lên 1 (L1 = 5, L2 = 5), rồi sau đó cả P1 và P2
đồng thời ghi giá trị biến L của nó vào lại Count, thì Count chỉ tăng được 1 đơn
vị, Count = 6. Đây là điều mà chương trình không mong muốn nhưng cả chương
trình và hệ điều hành đều khó có thể phát hiện được. Nguyên nhân ở trên là do 2
tiến trình P1 và P2 đồng thời truy xuất biến Count, cả khi nhận giá trị của Count,
lẫn khi ghi giá trị vào Count. Trong trường hợp này tài nguyên găng là biến
count.
+ Đoạn tới hạn (Critical Section): Đoạn Code trong các tiến trình đồng
thời, có tác động đến các tài nguyên có thể trở thành tài nguyên găng được gọi là
đoạn găng hay miền găng.
Một giải pháp cho vấn đề đoạn găng phải thỏa mãn 3 yêu cầu:
+ Loại trừ lẫn nhau: nếu tiến trình P
i
đang thực hiện trong đoạn găng của
nó thì các tiến trình khác không được thực hiện trong đoạn găng của chúng hay
nói cách khác tại một thời điểm không thể có hai tiến trình nằm trong đoạn găng.
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 5
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
+ Chọn tiến trình tiếp theo được vào đoạn găng: nếu không có tiến trình
nào đang trong đoạn găng của nó và một số tiến trình muốn vào đoạn găng của
chúng thì chỉ những tiến trình đang không trong đoạn còn lại mới là ứng cử
viên.
+ Chờ đợi có hạn: tồn tại giới hạn số lần các tiến trình khác được phép
vào đoạn găng của chúng sau khi một tiến trình yêu cầu vào đoạn găng đến
trước khi yêu cầu đó được đáp ứng.
4. Kiểm nghiệm giải thuật:
Các yêu cầu vào đoạn găng được xử lý theo trật tự FIFO và theo quan hệ
<thời gian, số>. Khi trạm i vào đoạn găng có nghĩa là nó đã nhận thông điệp từ

tất cả các trạm khác và tất cả các thông điệp đều sau thông điệp REQ của nó.
Ta kiểm tra các đặc tính sau đây:
+ Trạm i đang ở trong đoạn găng là trạm duy nhất nằm trong đoạn găng
ấy. Thực tế cho thấy thông điệp REQ được phát đi bởi trạm i vẫn tiếp tục tồn tại
trong các hàng đợi cho đến khi nó được thay thế bởi thông điệp REL.
+ Trạm đã yêu cầu vào đoạn găng phải đảm bảo thời hạn và phải ra khỏi
đoạn găng sau một khoảng thời gian xác định. Thuật toán thể hiện tính đồng đều
và tránh được tổn thất.
Ví dụ: Xét một mạng gồm 3 trạm, trong số đó trạm 1 và trạm 2 yêu cầu vào
đoạn găng tại thời điểm 2 của đồng hồ Logic của chúng. Tập hợp các thông điệp
được truyền đi giữa chúng với nhau được mô tả theo hình vẽ sau và ta cũng có
thể tìm thấy một số trạng thái của các hàng đợi thông điệp:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 6
Đoạn găng
của trạm 2
Đoạn
găng
của
trạm 1
ACQ,6,3
REL,10,1
ACQ,9,1
ACQ,6,2
ACQ,4,3
REQ,2,1
REQ,2,2
REQ,2,1 REQ,2,2
1
2
3

7
8
9
10
Trạm 1
H
1
1
2
3
7
8
9
10
Trạm 2
H
2
1
2
3
7
8
9
10
Trạm 3
H
3
REL,10,1
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
Ta nhận thấy rằng:

+ Trạm 1 vào đoạn găng tại H
1
= 7
+ Trạm 2 vào đoạn găng tại H
2
= 11
5. Phản ứng với sự cố:
Sự cố xảy ra với trạm chưa vào được trong đoạn găng không làm rối loạn
hoạt động của giải thuật với điều kiện nó truyền thông điệp vang_mat cho việc
chuyển tải ở mạng giao vận. Do có trang bị như thế, việc vào đoạn găng trở nên
dễ dàng và nhanh chóng cho các trạm khác. Nếu trạm có sự cố đã gửi yêu cầu,
thì nó kết thúc với lý do trở thành trước đối với tất cả các trạm khác.
Khi một trạm lại được đưa vào trong mạng sau khi đã khắc phục sự cố, nó
cần phải kiến tạo lại trạng thái hiện hành của các yêu cầu. Để đảm bảo điều đó,
nó phát đi thông điệp vao_lai và để trả lời, các trạm gửi thời gian cuối cùng của
các yêu cầu cuối cùng của nó REQ không được thoả mãn hoặc một thông điệp
REL. Mạng cần phải bổ khuyết cho các trạm bị sự cố bằng cách gửi thông điệp
vang_mat. Khi nó đã nhận tất cả các trả lời cho thông điệp vao_lai, trạm vừa
đưa vào đó có thể bắt đầu lại bằng các yêu cầu.
6. Kết luận:
Các dấu được cung cấp bởi đồng hồ Logic cho phép đánh dấu các sự kiện
và xác định một tổng quát chặt chẽ. Nhưng tại đây không có quan hệ nào giữa
các sự kiện và các giá trị của dấu.
Trên một trạm cho trước, việc nhận một thông điệp có đóng dấu không
thể cho nó biết còn sự kiện nào trước sự kiện đó đang ở trên đường. Như thế, ta
còn phải nhận thông điệp từ các trạm khác còn lại.
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 7
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
II. Xây dựng chương trình:
1. Giới thiệu ngôn ngữ 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
đượ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)
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 8
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
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.
2. Kiến trúc và kỹ thuật RMI:
2.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ược 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
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 9
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
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
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ó.
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ủ 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
2.2 Kiến trúc RMI:
Ứng dụng phân tán trong Java thông qua cơ chế RMI (Remote Method
Invocation) thực chất là sự kết hợp nhiều đối tượng đang tồn tại trên các máy
khác nhau để giải quyết vấn đề.
Đối tượng này sử dụng hàm của đối tượng khác ở xa để thực thi công
việc. Khi đó việc gọi thực thi đối tượng ở xa cũng giống như gọi đối tượng địa
phương.
Để làm được điều này, ứng dụng phân tán RMI dùng bộ phận đăng ký
dịch vụ (Registry) để quản lý hoạt động của các đối tượng trên mạng. Khi đó

thông qua bộ phận đăng ký này, máy ảo Java đóng vai trò Server sẽ liên kết với
đối tượng ở xa (Remote object).
RMI cung cấp khả năng triệu gọi các phương thức của một đối tượng từ
xa thông qua giao thức JRMP. Bằng cách này có thể liên lạc và thực thi các ứng
dụng xuyên qua nhiều hệ thống trên một mạng. RMI-JRMP – Remote Method
Invocation (RMI), một chuẩn dùng để gọi hàm từ xa dựa trên Java Remote
Message Protocol (JRMP)
Client tìm đến đối tượng ở xa thông qua tên đã đăng ký với bộ phận đăng
ký Server này. Bộ phận đăng ký dịch vụ được thiết lập mặc định ở cổng 1099
thông qua RMIREGISTRY, có trong bộ công cụ phát triển Java (J2SDK).
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 10
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
Vị trí của hệ thống RMI trong ứng dụng phân tán được mô tả như hình
dưới. Trong đó các chương trình Client và Server trao đổi với nhau qua cầu nối
của hệ thống RMI.
Kiến trúc của hệ thống RMI bao gồm các tầng như sau:
+ Tầng ứng dụng: Bao gồm ứng dụng Server và Client.
Server:
• Hiện thực giao diện Remote mà Client dùng
• Xuất (Exports) đối tượng mà các phương thức của nó được
triệu gọi từ xa (bằng cách tạo lớp là UnicastRemoteObject)
• Đăng ký chính nó với độ đăng ký RMI.
Client:
• Nhận tham chiếu đến đối tượng
• Chuyển các tham chiếu như những giao diện từ xa.
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 11
RMI Registry
RMI Client
RMI Server
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11

• Triệu gọi các hành vi của đối tượng
+ Tầng ủy quyền: Bao gồm
- Client (gọi là Stub)
- Server (gọi là Skeleton)
+ Tầng truy cập từ xa: Sự trừu tượng hóa giữa tầng ủy quyền và tầng vận
chuyển.
+ Tầng vận chuyển: Quản lý sự giao tiếp giữa các Host với nhau trên
mạng, dựa trên kết nối TCP/IP. Thực chất thực hiện kết nối giữa các máy ảo
Java.
Các bước để hin thc ứng dụng phân tán trên h thống RMI:
+ Mô tả giao diện (Interface) của đối tượng cùng với các hành vi cần sử
dụng. Giao diện này được đặt trên cả Client và Server. Giao diện này có thể là
Remote hay Serializable.
+ Hiện thực nội dung của giao diện ở trên trong một lớp cụ thể đặt ở
Server.
+ Sử dụng tiện ích Rmic của JDK để tạo các lớp Stub đặt trên Client và
Skeleton trên Server.
+ Xây dựng lớp để thực hiện trên Server, trong lớp này có sử dụng hành
vi ExportObject() của lớp UnicastRemoteObject để báo cho máy ảo Java biết
đối tượng được truy cập đến từ xa bởi các đối tượng khác.
+ Sử dụng các phương thức trên máy Server từ các lớp trên máy Client.
Như vậy, trong quá trình thực hiện có 3 máy ảo Java hoạt động:
+ Quản lý bộ đăng ký (RmiRegistry).
+ Thực thi đối tượng nhằm xuất khẩu đối tượng ra ngoài.
+ Thực thi chương trình của Client.
2.3 Kỹ thuật RMI:
Cơ chế làm việc của chương trình trên Client và Server khi đã được đăng
ký bởi bộ đăng ký Rmiregistry như sau:
+ Máy ảo Java (JVM) trên máy Server dùng hàm Bind() hoặc Rebind()
của lớp Naming để đăng ký với Rmiregistry.

+ Chương trình client dùng hàm Naming.Lookup() để yêu cầu bộ đăng
ký cho biết tham chiếu đến đối tượng.
+ Bộ đăng ký Rmiregistry trả về tham chiếu đối tượng tồn tại trên máy
Server.
+ Trên cơ sở tham chiếu của đối tượng do hàm Lookup() trả về, chương
trình Client sử dụng để triệu gọi hành vi của đối tượng trên máy Server.
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 12
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
Các gói thông dụng thường được sử dụng:
+ Java.lang: Chứa các lớp quan trọng nhất của ngôn ngữ Java. Chúng
bao gồm các kiểu dữ liệu cơ bản như ký tự, số nguyên, Chúng cũng chứa các
lớp làm nhiệm vụ xử lý lỗi và các lớp vào ra chuẩn. Một vài lớp quan trọng khác
như String hay StringBuffer.
+ Java.applet: Đây là package nhỏ nhất chứa một mình lớp Applet. Các
Applet nhúng trong trang Web hay chạy trong Appletviewer đều thừa kế từ lớp
này.
+ Java.awt: Package này đươợc gọi là Abstract Window Toolkit (AWT).
Chúng chứa các lớp dùng để tạo giao diện đồ họa. Một số lớp bên trong là:
Button, GridBagLayout, Graphics.
+ Java.io: Cung cấp thư viện vào ra chuẩn. Chúng cho phép tạo và quản
lý dòng dữ liệu theo nhiều cách.
+ Java.util: Package này cung cấp một số công cụ hữu ích. Một vài lớp
của package này là: Date, Hashtable, Stack, Vector và StringTokenizer.
+ Java.net: Cung cấp khả năng giao tiếp với máy từ xa. Cho phép tạo và
kết nối tới Socket hoặc URL.
+ Java.awt.event: Chứa các lớp, giao diện dùng để xử lý các sự kiện
trong chương trình như chuột, bàn phím.
+ Java.rmi: Công cụ để gọi hàm từ xa. Chúng cho phép tạo đối tượng
trên máy khác và sử dụng các đối tượng đó trên máy cục bộ.
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 13

Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
+ Java.security: Cung cấp các công cụ cần thiết để mã hóa và đảm bảo
tính an toàn của dữ liệu truyền giữa máy trạm và máy chủ.
+ Java.sql: Package này chứa Java DataBase Connectivity (JDBC), dùng
để truy xuất cơ sở dữ liệu quan hệ như Oracle, SQL Server,
3. Các Modules chương trình:
a. Tạo các Server:
- Mô tả giao diện:
- Khai báo hàng đợi:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 14
public interface Server1 extends java.rmi.Remote
{
public abstract void printQueue()
throws java.rmi.RemoteException;
public abstract void sendMess()
throws java.rmi.RemoteException;
public abstract void receiveMess(String R, int H, int I)
throws java.rmi.RemoteException;
public abstract void setStart(boolean start)
throws java.rmi.RemoteException;
}
public class Queue
{
private boolean start;
int max=0;
private String Q[];
public boolean change=false;
private boolean ready=true;
public Queue()
{

start = false;
max=40;
Q=new String [max];
for (int i=0;i<max;i++) Q[i]="";
}

Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- In các thông điệp trong hàng đợi:
- Thêm vào hàng đợi:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 15
public void printQueue()
{
if (!change) return;
int i=0;
System.out.println(" Queue ");
while (i<max-4 && Q[i] !=""){
System.out.println(Q[i] + " ~ " + Q[i+1] + " ~ " +
Q[i+2]);
i=i+4; }
System.out.println(" ");
change=false;
}
public void setQueue(String R, int H, int I)
{
deleteQueue(R, I);
int i=0;
while (i<max-4 &&
Q[i].compareToIgnoreCase("")!=0 &&
H>Integer.parseInt(Q[i+1])) i+=4;
if (i<max-4)

{
for(int j=max-1; j>=i+4; j ) Q[j]=Q[j-4];
Q[i]=R; Q[i+1]=H +"";
Q[i+2]=I +""; Q[i+3]=0 +"";
change=true;
}
}
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Kiểm tra quyền vào đoạn găng:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 16
public int checkAccess(int idx)
{
try
{ int i=0;
while (i<max-4 && Q[i] !="")
{ if (Q[i].compareToIgnoreCase("REQ")==0)
{ if (Q[i+2].compareToIgnoreCase(idx +"")==0)
{
System.out.println("====================");
System.out.println("====================");
System.out.println("=== ACCESSING ====");
System.out.println("====================");
System.out.println("====================");
Thread.sleep(5000);
return 5;
}
else
{
return 0;
}

}
i=i+4;
}
return 0;
}
catch(java.lang.Exception exception)
{
System.out.println(exception.getMessage());
System.exit(0);
return 0;
}
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Xử lý tại Server:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 17
while (true)
{
S3=(Server3)java.rmi.Naming.lookup("rmi://localhost:2011/Server3");
S2=(Server2)java.rmi.Naming.lookup("rmi://localhost:2010/Server2");
String Q[] = queue.getQueue();
int i=0; int max=queue.getMax();
while (i<max-4 && Q[i].compareToIgnoreCase("") !=0)
{
if (Q[i].compareToIgnoreCase("REQ")==0 &&
Q[i+3].compareToIgnoreCase("0")==0)
{ if (Q[i+2].compareToIgnoreCase("1")==0)
{
Thread.sleep( delay_host_2 * 1000);
S2.receiveMess("REQ",time_logic,1);
time_logic++;
Thread.sleep( (delay_host_3 - delay_host_2) * 1000);

S3.receiveMess("REQ",time_logic,1);
time_logic++;
}
else
{
if (Q[i+2].compareToIgnoreCase("2")==0)
if (!queue.existREQ(1)){
Thread.sleep( delay_host_2 * 1000);
S2.receiveMess("ACQ",time_logic,1);
time_logic++; }
else
if (Q[i+2].compareToIgnoreCase("3")==0)
if (!queue.existREQ(1)){
Thread.sleep( delay_host_3 * 1000);
S3.receiveMess("ACQ",time_logic ,1);
time_logic++; }
} queue.printQueue();
}
else
if (Q[i].compareToIgnoreCase("ACQ")==0)
{
queue.printQueue();
int sl=queue.checkAccess(1);
if (sl>0)
{
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Mở Socket, lắng nghe và nhận lệnh từ JSP:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 18
receiveMess("REL",time_logic,1);
time_logic++;

queue.deleteACQ();
S2.receiveMess("REL",time_logic,1);
time_logic++;
S3.receiveMess("REL",time_logic,1);
time_logic++;
}
queue.printQueue();
}
else
if (Q[i].compareToIgnoreCase("")!=0)
queue.updateSend(Q[i],Integer.parseInt(Q[i+1]),
Integer.parseInt(Q[i+2]) );
i=i+4;queue.printQueue();
}
Thread.sleep(1000); time_logic++;
}
public static void main(String[] args) throws IOException {
ServerSocket server = null;
try {
server = new ServerSocket(11111);
}
catch (IOException ioe) {
ioe.printStackTrace();
System.exit(1);}
Socket client = null;
try {
while ((client = server.accept()) != null) {
ControllerServer controller = new ControllerServer(client);
Thread thread = new Thread(controller);
thread.start();

}
}
catch (IOException ioe) {
ioe.printStackTrace();
}
server.close();
}
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
b. Đăng ký Server:
c. Mở Socket và lắng nghe kết nối:
d. Thc hin gửi nhận thông đip:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 19
CLS
@ECHO OFF
ECHO ==========================================
ECHO RMI COMPILER
ECHO ==========================================
SET CLASSPATH=C:\Server
cd C:\Program Files\Java\jdk1.6.0_10\bin
rmic Server1_Ipl -d C:\Server
rmic Server2_Ipl -d C:\Server
rmic Server3_Ipl -d C:\Server
ECHO RMI Compiled OK!
PAUSE
CLS
@ECHO OFF
ECHO ************************************************
ECHO * MO SOCKET VA LANG NGHE KET NOI *
ECHO ************************************************
ECHO Please waiting

Cd C:\SERVER
Java ControllerServer
Pause
String str = inname.readLine();
if (str.compareToIgnoreCase("start") ==0)
{ S1.setStart (true); S2.setStart (true);
S3.setStart(true);
}
if (str.compareToIgnoreCase("REQ1") ==0)
{
S1.sendMess();
}
if (str.compareToIgnoreCase("REQ2") ==0)
{
S2.sendMess();
}
if (str.compareToIgnoreCase("REQ3") ==0)
{
S3.sendMess();
}
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
4. Chương trình chạy thử:
- Khởi động các Server:
- Trạng thái của các SERVER hiển thị trên JSP:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 20
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Khởi động Server điều khiển thông đip:
- Khởi động Server kết nối JSP:
- Các Port được mở và trạng thái từ chương trình:
LISTENING: Trạng thái của PORT đang lắng nghe.

Đoàn Ngọc Diễm My – Trần Thị Bích Đào 21
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Port WEB được mở từ TomCat:
ESTABLISHED: Trạng thái PORT đã kết nối
- Port được mở từ JSP:
TIME_WAIT: TCP vẫn tạm thời giữ kết nối giữa 2 Computer trong một
khoảng thời gian nhất định (TIME_WAIT), sau khi 2 bên đã ngừng kết nối, điều
này là cần thiết trước khi kết thúc hoàn toàn kết nối, để tránh tình trạng các
Packets bị chậm trễ trong phiên truyền sẽ khởi tạo kết nối mới, với Time_wait
chúng sẽ bị giữ lại và không được xem như một yêu cầu khởi tạo kết nối mới.
- Server 1 gửi thông đip REQ:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 22
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Server 2, Server 3 nhận thông đip và phản hồi ACQ, Server 1 bắt đầu
vào đoạn găng:
- Server 1 sau khi rời đoạn găng sẽ gửi thông đip REL đến các Server
khác:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 23
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Trường hợp Server 1 và Server 2 cùng gửi REQ:
- Server 1 nhận thông đip ACQ từ Server 3 và vào đoạn găng:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 24
Báo cáo Lập Trình Mạng Khoa học máy tính – Khóa 11
- Server 2 vẫn nhận được ACQ từ Server 3, nhưng chưa vào được găng
vì thông đip REQ của nó yêu cầu sau Server 1
- Server 1 sau khi rời đoạn găng sẽ gửi thông đip REL đến các trạm,
và Server 2 sẽ được quyền vào đoạn găng tiếp theo:
- Và Server 2 gửi thông đip REL sau khi đã rời đoạn găng:
Đoàn Ngọc Diễm My – Trần Thị Bích Đào 25

×