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

TIỂU LUẬN Môn: LẬP TRÌNH MẠNG YÊU CẦU ĐÁP ỨNG YÊU CẦU

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 (281.24 KB, 28 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA

TIỂU LUẬN
Môn: LẬP TRÌNH MẠNG
GVHD: PGS.TS Lê Văn Sơn
HVTH: - Lê Hữu Liêm
- Nguyễn Mạnh Hùng
Lớp: Cao học KHMT khóa 11
Lập trình mạng

ĐÀ NẴNG, tháng 03/2009
MỤC LỤC
ĐÀ NẴNG, tháng 03/2009 2
MỞ ĐẦU 3
PHẦN 1: CƠ SỞ LÝ THUYẾT 4
Chương 1: CÁC KIẾN THỨC CƠ SỞ 4
1.1 Vấn đề về yêu cầu từ xa: 4
1.1.1 Khái niệm yêu cầu từ xa: 4
1.1.2. Giải thuật tổng quát: 4
Hệ thống A 4
Hệ thống B 5
1.2. Giao dịch: 6
1.2.1. Khái niệm giao dịch (Transaction) 6
1.2.2. Các tính chất của giao dịch: 6
1.2.2.1. Tính nguyên tử (atomicity): 6
1.2.2.2. Tính nhất quán (consistency): 6
1.2.2.3. Tính biệt lập (isolation): 6
1.2.2.4. Tính bền vững (durability): 7
1.2.3. Các loại giao dịch: 7
1.3 Hoạt động phân tán: 7


Chương 2: KẾT NỐI CÁC CƠ SỞ DỮ LIỆU VỚI JDBC VÀ
LẬP TRÌNH MẠNG 9
2.1. Giới thiệu về JDBC (Java DataBase Connectivity): 9
2.2. Lập trình trên mạng: 11
2.2.1 Một số lớp cần thiết của gói thư viện java.net 11
2.2.2. RMI và lập trình phân tán hướng đối tượng trong Java: 12
2.2.2.1. Khái niệm chung 12
2.2.2.2. Gọi phương thức từ xa và các vấn đề phát sinh 13
2.2.2.3. Vai trò các lớp trung gian STUB và SKELETION 13
2.2.2.4. Cài đặt ứng dụng phân tán của RMI 14
2.2.2.5. Cơ chế gọi hàm từ xa của các đối tượng RMI một cách tổng quát 14
2.2.2.6. Bộ đăng ký (Registry) 16
PHẦN 2: THUẬT TOÁN LỒNG MỞ VÀ CHƯƠNG TRÌNH 17
Chương 1 Thuật giải 17
Chương 2: Chương trình 18
Lớp Khoa học máy tính – K11 (2009-2011)
2
Nhóm 8- Đề số 19
Lập trình mạng

MỞ ĐẦU
Chúng ta biết rằng một trong những tư tưởng lớn của hệ tin học phân tán là
phân tán hóa quá trình xử lý thông tin và thực hiện công việc đó trên các trạm xa
nhau. Hệ phân tán thực hiện hàng loạt các chức năng phức tạp, nhưng cơ bản
nhất là đảm bảo cung cấp cho người sử dụng khả năng truy cập có kết qủa đến
các loại tài nguyên vốn có và rất đa dạng của hệ thống như là những tài nguyên
dùng chung.
Một trong những ứng dụng quan trọng của mạng thông tin toàn cầu Internet
là thương mại điện tử. Thương mại điện tử bao gồm nhiều vấn đề, ở đây ta chú
trọng đến hệ thống mua bán từ xa, gọi tắt là hệ kinh doanh từ xa (HKDTX).

Giả sử HKDTX giải quyết các vấn đề kinh doanh của mình trên địa bàn
lớn. Tại mỗi vùng có có các server chứa các cơ sở dữ liệu (CSDL) được nối kết
với nhau qua hệ thống truyền thông, và hệ có thể thực hiện được các chức năng
chủ yếu như:
1. Cập nhật thường xuyên các thông tin trong CSDL.
2. Trả lời các yêu cầu thông tin có liên quan liên quan đến việc kinh
doanh.
3. Đăng ký mua bán từ xa.
Trong phạm vi đề tài này chỉ nghiên cứu yêu cầu và đáp ứng yêu cầu đối
với hệ phân tán thông qua HKDTX. Nội dung đề tài gồm:
Phần 1: Cơ sở lý thuyết
Chương 1: Các kiến thức cơ sở
Bao gồm các vấn đề về yêu cầu từ xa của hệ đa server, các loại giao dịch
và hoạt động phân tán.
Chương 2: Kết nối CSDL với JDBC và lập trình trên mạng.
Phần 2: Thuật toán lồng mở và chương trình
Chương 1: Thuật toán lồng mở
Chương 2: Chương trình thể hiện thông tin truy vấn.
Tôi xin chân thành cám ơn sự hướng dẫn của thầy Lê Văn Sơn và bạn bè đã
tạo điều kiện giúp tôi hoàn thành đề tài này.
Lớp Khoa học máy tính – K11 (2009-2011)
3
Nhóm 8- Đề số 19
Hệ thống A
phatyeucau(B,yc)
nhanlai(ketqua)
Lập trình mạng

Đà Nẵng, ngày 02 tháng 6 năm 2008
PHẦN 1: CƠ SỞ LÝ THUYẾT

Chương 1: CÁC KIẾN THỨC CƠ SỞ
1.1 Vấn đề về yêu cầu từ xa:
1.1.1 Khái niệm yêu cầu từ xa:
Ngày nay hầu hết các hoạt động kinh doanh, đào tạo, thư viện đều được
xây dựng trên cơ sở nhiều Server mắc nối với nhau thông qua đường truyền. Tại
mỗi Server có các chương trình quản lý và các cơ sở dữ liệu của hệ thống.
Đề nghị được chỉ dẫn là chức năng đơn giản nhất của hệ thống.Giả sử có
một khách hàng đang có mặt tại bộ phận của thành phố A muốn được cung cấp
thông tin về giá cả của một mặt hàng do bộ phận này quản lý tại thành phố B ở
xa và thể hiện một yêu cầu nào đó qua một truy vấn. Đầu kia sau khi tiếp nhận,
việc truy tìm trong Cơ sở dữ liệu được tiến hành. Nếu có thông tin cần tìm thì
thông tin đó sẽ được chuyển lại cho người yêu cầu. Nếu không có thì thông tin
được chuyển sang 1 thành phố khác để tìm…. Để đáp ứng được yêu cầu này, hệ
thống phải có khả năng thực hiện hàng loạt các thao tác xác định.
1. Trước hết, hệ phải có khả năng nhận biết thông tin cần thiết cho việc trả
lời đang nằm tại vị trí nào. Đó chính là vấn đề trỏ thông tin.
2. Sau khi đã trỏ đúng vào địa chỉ chứa thông tin, hệ phải có khả năng tiếp
nhận và ghi lại các yêu cầu chỉ dẫn.
3. Biên dịch các yêu cầu này thành dạng lệnh có thể thực hiện được để có
thể truy tìm thông tin.
4. Thực hiện các công việc mang tính chất cục bộ của hệ thống cục bộ như
kiểm tra quyền truy cập thông tin, thống kê số lượng người truy cập, lập hoá đơn
dịch vụ và báo thanh toán dịch vụ…
5. Nếu tìm được thông tin theo yêu cầu thì gửi nó cho hệ thống yêu cầu.
Theo kiểu tương tác này ta có mô hình Client/Server, trong đó hệ thống
(hay trạm) gửi yêu cầu thông tin gọi là khách (Client), còn hệ thống tiếp nhận và
giải quyết yêu cầu gọi là chủ (Server).
1.1.2. Giải thuật tổng quát:
Có thể cài đặt trong A và B để triển khai theo mô hình Client/Server :
Lớp Khoa học máy tính – K11 (2009-2011)

4
Nhóm 8- Đề số 19
Hệ thống B
Lặp lại
Nhanyeucau(s,nh)
Nếu (hợp thức) thì
Bắt đầu
tracuucsdl
thongke
phatketqua(s,kq)
Kết thúc
Nếu không
guitbao(s,thong bao)
Cho đến khi đúng
Lập trình mạng

Ta sử dụng hàm nguyên thuỷ phatyeucau(B,yc) để gửi cho hệ thống B yêu
cầu truy cập để tìm thông tin. Hàm nhanlai(ketqua) sẽ được sử dụng để trả lời
cho A biết trạng thái của B.
Tương tự như A, tại B người ta cài đặt thủ tục bao gồm các hàm nguyên
thuỷ nhanyeucau(s,nh) – nhận yêu cầu trong nh, tracuucsdl – tra cứu thông tin
theo yêu cầu trong CSDL, thongke- sử dụng riêng cho trạm nhận và
phatketqua(s,kq), guitb(s,thongbao) được sử dụng để trả lời cho B.
Trường hợp tra cứu vừa nêu là đơn giản bởi vì phép toán diễn ra độc lập.
Có rất nhiều trường hợp phức tạp hơn, trong đó một phép tra cứu lại phụ thuộc
vào các phép xử lý khác trước đó. Bây giờ, ta hãy xem xét trường hợp: một
người từ thành phố A yêu cầu tập hợp thông tin chỉ dẫn liên quan đến hàng loạt
phép tra cứu vào CSDL của bộ phận ở B mà kết quả của phép sau có được phụ
thuộc vào kết quả của phép trước đó. Điều này không thể tiến hành bằng một
lệnh hoặc là một hàm mà phải được tiến hành bằng thủ tục truy vấn. Thủ tục này

có khả năng liên kết tự động các tra cứu sơ đẳng như hàm tracuucsdl lại với
nhau. Chương trình truy vấn đầy đủ có thể được cài đặt tại máy Client hoặc tại
máy Server. Hai giải pháp này khác nhau ở bản chất và khối lượng thông tin trao
đổi giữa các trạm với nhau.
Một trong những vấn đề cần phải quan tâm là độ tin cậy của thông tin.
Thông tin là đúng tại thời điểm mà Server đọc nó, nhưng có thể sai khi Client
nhận được, điều này liên quan đến việc làm tươi thông tin trong CSDL. Nói một
cách tổng quát là cần phải có những giải pháp hữu hiệu cho việc truy cập đồng
thời vào dữ liệu dùng chung.
Lớp Khoa học máy tính – K11 (2009-2011)
5
Nhóm 8- Đề số 19
Lập trình mạng

Trong thực tế, những trường hợp nêu trên hoàn toàn có thể diễn ra. Ví dụ
như có một khách hàng tại A đề nghị mua hàng hoá H tại B và C. Anh ta có thể
nhận được lời chấp nhận với một lượng cụ thể nhưng không có hoặc không đủ
tại B và C. Trong khi truy cập để báo cho khách thì số lượng này cũng vừa được
cập nhật. Nói tóm lại, khách nhận được thông tin mà trên thực tế không còn tồn
tại nữa.
1.2. Giao dịch:
1.2.1. Khái niệm giao dịch (Transaction)
Giao dịch được tạo bởi một dãy các thao tác đọc và ghi trên CSDL cùng với
các bước tính toán cần thiết.
Một giao dịch luôn luôn phải kết thúc ngay cả khi có xảy ra sự cố.
- Nếu giao dịch có thể hoàn tất thành công tác vụ của nó ta bảo giao dịch
có ủy thác (commit). Khi được ủy thác, giao dịch này được phản ánh vào CSDL
và kết quả của giao dịch được lưu vào CSDL không thể hồi lại được.
- Nếu giao dịch phải ngừng lại khi chưa hoàn tất công việc, ta bảo nó bị
hủy bỏ (abort); Khi một giao dịch bị hủy bỏ, quá trình thực thi sẽ ngừng và tất cả

mọi hành động đã được thực hiện đều phải được hồi lại (undo), đưa CSDL trở
về trạng thái trước khi thực hiện giao dịch. Quá trình này gọi là cuộn ngược
(rollback)
1.2.2. Các tính chất của giao dịch:
Giao dịch là một đơn vị tính toán nhất quán và tin cậy do 4 tính chất - gọi
chung là tính chất ACID:
1.2.2.1. Tính nguyên tử (atomicity):
Tính nguyên tử liên quan đến sự kiện là một giao dịch được xử lý như
một đơn vị họat tác. Chính vì thế mà các hành động của giao dịch: hoặc tất cả
đều hoàn tất hoặc không hành động nào hoàn tất (hồi lại tất cả các hành động đã
được thực hiện).
1.2.2.2. Tính nhất quán (consistency):
Giao dịch là một chương trình đúng đắn, ánh xạ CSDL từ trạng thái nhất
quán này sang trạng thái nhất quán khác.
1.2.2.3. Tính biệt lập (isolation):
Một giao dịch đang thực thi không thể làm lộ ra các kết quả của nó cho
những giao dịch khác đang cùng họat động trước khi nó ủy thác.
Lớp Khoa học máy tính – K11 (2009-2011)
6
Nhóm 8- Đề số 19
Lập trình mạng

1.2.2.4. Tính bền vững (durability):
Một khi giao dịch ủy thác, kết quả của nó được duy trì cố định và không
bị xóa khỏi CSDL.
1.2.3. Các loại giao dịch:
Dựa vào cấu trúc giao dịch được phân thành 3 họ lớn:
- Giao dịch phẳng (flat transaction): là giao dịch có một khởi điểm duy
nhất và một điểm kết thúc duy nhất.
- Giao dịch lồng (nested transaction): đây là mô hình giao dịch cho phép

một giao dịch chứa những giao dịch khác với điểm bắt đầu và ủy thác riêng của
chúng. Các giao dịch khác này được gọi là giao dịch con. Mức độ lồng nói
chung là để ngỏ, cho phép các giao dịch con cũng có thể có các giao dịch lồng.
Ta phân biệt 2 kiểu lồng do các đặc trưng kết thúc của chúng: kiểu lồng đóng
(closed nesting) và kiểu lồng mở (opened nesting)
+ Các giao dịch lồng đóng ủy thác theo lối từ dưới lên đến gốc. Vì thế
một giao dịch con lồng được thực hiện bắt đầu sau cha và hoàn tất trước nó và
việc ủy thác giao dịch con phụ thuộc vào việc ủy thác của giao dịch cha.
+ Các giao dịch lồng mở cho phép bên ngòai giao dịch thấy được các kết
quả một phần của nó.
Ưu điểm của giao dịch lồng:
* Cung cấp mức độ “đồng thời” cao hơn cho các giao dịch.
* Trong giao dịch phẳng, nếu 1 thao tác nào bị thất bại thì toàn bộ giao
dịch đều bị hủy bỏ và khởi động lại; Còn trong giao dịch lồng, nếu một thao tác
bị thất bại, chỉ có giao dịch con chứa thao tác đó mới cần phải hủy bỏ và khởi
động lại.
* Có thể tạo giao dịch mới từ giao dịch hiện có bằng cách đưa giao dịch
cũ vào trong giao dịch mới làm giao dịch con của nó.
- Lưu công (workflow): là tổ hợp các giao dịch lồng mở và lồng đóng.
1.3 Hoạt động phân tán:
Từ khái niệm giao dịch ta xem bộ phận theo dõi họat động phân tán hoạt
động như thế nào.
Bộ phận theo dõi hoạt động phân tán gồm 2 đơn vị: bộ quản lý giao dịch
(TM-Transaction Manager) và bộ xếp lịch (SC- Scheduler).
Bộ quản lý giao dịch chịu trách nhiệm điều phối việc thực hiện các thao tác
CSDL của các ứng dụng.
Lớp Khoa học máy tính – K11 (2009-2011)
7
Nhóm 8- Đề số 19
Xếp lịch các

thỉnh cầu
Lập trình mạng

Bộ xếp lịch chịu trách nhiệm cài đặt thuật toán điều khiển nhằm đồng bộ
hóa việc truy xuất đến CSDL.
Tham gia vào việc quản lý giao dịch phân tán là bộ quản lý khôi phục cục
bộ (local recovery manager) có mặt tại mỗi vị trí. Chức năng của chúng là cài
đặt các thủ tục khôi phục tại chỗ nhằm đưa CSDL về trạng thái nhất quán sau
khi xảy ra sự cố.
Mỗi giao dịch đều xuất phát từ một vị trí và ta gọi đó là vị trí khởi nguồn.
Việc thực hiện các thao tác CSDL của một giao dịch được điều phối bởi TM tại
vị trí khởi nguồn của giao dịch.
Bộ quản lý giao dịch cài đặt một giao diện cho các ứng dụng, bao gồm 5
lệnh: begin_transaction, read, write, commit, abort:
i. Begin_transaction: chỉ cho TM biết giao dịch mới bắt đầu.
ii. Read: Nếu dữ liệu x được lưu cục bộ, giá trị của nó được đọc và
chuyển cho giao dịch. Nếu không phải, TM sẽ chọn một bản sao của x và yêu
cầu chuyển bản sao đó cho giao dịch.
iii. Write: TM điều phối việc cập nhật giá trị x tại mỗi vị trí có chứa nó.
Commit: TM điều phối việc cập nhật vật lý của tòan thể CSDL có chứa bản sao
của mỗi dữ liệu mà một lệnh Write trước đó đã đưa ra.
iv. Abort: TM kiểm tra lại rằng không có tác động nào của giao dịch được
phản ánh trong CSDL.
Khi cung cấp các dịch vụ này, TM có thể giao tiếp với SC và bộ xử lý dữ
liệu tại cùng vị trí hoặc khác vị trí.
Begin_transaction Kết quả
Read, Write
Commit, Abort
với các SC khác
Với các

TM khác
với các bộ xử lý
dữ liệu
Lớp Khoa học máy tính – K11 (2009-2011)
8
Nhóm 8- Đề số 19
Bộ quản lý giao dịch TM
Bộ xếp lịch SC
Lập trình mạng

Đến các bộ xử lý dữ liệu
Bộ phận theo dõi hoạt động phân tán
Chương 2: KẾT NỐI CÁC CƠ SỞ DỮ LIỆU VỚI
JDBC VÀ LẬP TRÌNH MẠNG
2.1. Giới thiệu về JDBC (Java DataBase Connectivity):
JDBC của Sun là một công cụ phổ dụng hỗ trợ việc xây dựng những ứng
dụng tích hợp, dựa trên những CSDL khác nhau được thiết lập ở nhiều nơi khác
nhau trên mạng. JDBC là giao diện để kết nối với CSDL, gồm một tập các lớp
đối tượng hỗ trợ để xử lý CSDL quan hệ và để tương tác với các nguồn dữ liệu
khác nhau.
JDBC API (Application Programming Interface) được JavaSoft phát triển
và là một phần của tất cả các cài đặt ứng dụng của JVM. JDBC API cung cấp
các chức năng cơ bản để truy nhập đến hầu hết các CSDL thông qua SQL như:
- Thực hiệncác truy vấn vào một CSDL.
- Xử lý kết quả truy vấn.
- Xác định các thông tin về cấu hình hệ thống.
JDBC định nghĩa các đối tượng API và các hàm để tương tác với những
CSDL. Chương trình ứng dụng Java kết nối các CSDL phải được thực hiện theo
các bước sau:
1. Tạo đối tượng kết nối vào CSDL bằng cách gọi hàm getConnection()

để nhận đối tượng của lớp Connection.
2. Tạo ra một đối tượng của lớp Statement để xử lý câu lệnh.
3. Truyền tham số cho các lệnh SQL trong các hệ quản trị CSDL và các
đối tượng xử lý câu lệnh đó.
4. Kết quả truy vấn là đối tượng của lớp ResultSet.
Sau đây là một số giao diện, một số lớp trong gói java.sql và một số hàm
chính của chúng.
Lớp DriverManager
Lớp DriverManager chịu trách nhiệm nạp các bộ điều khiển JDBC và tạo
ra sự kết nối giữa các đối tượng của CSDL. Trước khi sử dụng một bộ điều
khiển (Driver) thì nó phải đăng ký với DriveManager nhờ hàm forName() của
lớp Class:
try{
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Lớp Khoa học máy tính – K11 (2009-2011)
9
Nhóm 8- Đề số 19
Lập trình mạng

Class.foeName(“com.oracle.jdbc.OracleDriver”);
} catch (ClassNotFoundException e){
… //xử lý ngọai lệ
}
Sau đó chương trình phải kết nối với CSDL bằng cách sử dụng
DriverManager.getConnection(jdbc:driver:databaseName)
Giao diện Connection
Giao diện java.sql.Connection phục vụ cho việc kết nối các CSDL
Tạo một đối tượng con để kết nối:
Connection con =
DriverManager.getConnection(“url”,”username”,”password”);

Trong đó: url là jdbc:driver:databaseName
Một số hàm:
Public abstract void commit() throws SQLException; ủy quyền thay đổi
những kết quả đã cập nhật, nếu không thì những thay đổi trong quá trình cập
nhật CSDL sẽ không được thực thi.
Public abstract boolean getAutoCommit() throws SQLException;
Public abstract void setAutoCommit(boolean autoCommit) throws
SQLException; khôi phục các thông tin nếu giao dịch không thực hiện thành
công.
Giao diện Statement
Giao diện Statement để thực hiện các câu lệnh của SQL. Trong
Statement có các hàm: execute(), executeQuery(), executeUpdate(),
executeBatch()…. nhận các tham đối là các câu lệnh của SQL để thực hiện như:
CREATE, UDATE, INSERT… và có thể xử lý theo lô.
Tạo đối tượng của Statement:
Statement stmt = con.createStatement(); kết quả truy vấn được từ CSDL
chỉ cho phép đọc.
Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE); kết quả truy vấn được từ CSDL cho phép
thay đổi dữ liệu.
Hàm addBatch(): cho phép thực hiện cập nhật các trường dữ liệu cùng
một lúc.
Hàm executeBatch(): chuyển các lệnh SQL thực hiện theo lô và trả về số
bản ghi đã được cập nhật theo lô.
Trong Statement có các hàm: execute(), executeQuery(),
executeUpdate(),
executeBatch()…. nhận các tham đối là các câu lệnh của SQL để thực hiện như:
Lớp Khoa học máy tính – K11 (2009-2011)
10

Nhóm 8- Đề số 19
Lập trình mạng

CREATE, UDATE, INSERT… và có thể xử lý theo lô.
Giao diện ResultSet
Kết quả của các câu lệnh xử lý với SQL được lưu trữ và xử lý thông qua đối
tượng của ResultSet. Chẳng hạn:
ResultSet rs = stmt.executeQuery(“SELECT * FROM SANPHAM”); đối
tượng rs của ResultSet chứa những kết quả truy vấn vào CSDL SANPHAM theo
câu lệnh SELECT của SQL.
Hàm getString(“fieldname”), getInt(“fieldname”), : đọc giá trị các
trường dữ liệu.
Hàm boolean next(): chuyển sang hàng tiếp theo.
2.2. Lập trình trên mạng:
Để trao đổi được giữa các ứng dụng với nhau trên mạng, Java sử dụng
TCP/IP để kết nối mạng thông qua kết nối các socket để gửi và nhận các thông
điệp. Một socket đóng vai trò như một đầu cuối của quá trình trao đổi trong một
hệ thống hay giữa hệ thống với nhau. Java cung cấp nhiều lớp để thực hiện các
nhiệm vụ của socket trên mạng.
2.2.1 Một số lớp cần thiết của gói thư viện java.net.
- Lớp InetAddress: quản lý địa chỉ của Internet theo tên và theo số. Các
phương thức thường dùng:
public static InetAddress getLocalHost() : trả về đối tượng là địa chỉ của máy
cục bộ (local host).
public static InetAddress getByName(String host) throws
UnknownHostException: phương thức này nhận địa chỉ của một máy bằng kiểu
chuỗi String và trả về đối tượng kiểu InetAddress thay mặt cho địa chỉ máy này.
- Lớp Socket: để tạo kết nối từ máy khách đến máy chủ thường được khởi
dựng bằng các phương thức sau:
public Socket(String host, int port) throws UnknownHostException,

IOException : Tạo ra một socket kết nối máy có tên theo địa chỉ host và số cổng
port.
public Socket(InetAddress address, int port) throws IOException : Tạo ra
một socket kết nối từ địa chỉ là đối tượng InetAddress và số cổng port.
Các phương thức hỗ trợ cho lớp Socket từ phía máy khách:
Lớp Khoa học máy tính – K11 (2009-2011)
11
Nhóm 8- Đề số 19
Lập trình mạng

InputStream getInputStream() throws IOException: lấy về luồng nhập để
máy khách có thể đọc dữ liệu trả về từ phía máy chủ
OutputStream getOutputStream() throws IOException: lấy về luồng xuất để
máy khách có thể ghi dữ liệu gửi đến máy chủ
InetAddress getInetAddress(): Lấy địa chỉ kết nối socket của máy chủ.
int getPort() : lấy về số cổng dùng kết nối của máy chủ.
synchronized void close() throws IOException: cắt đứt kết nối với máy chủ

- Lớp ServerSocket: dùng tạo kết nối từ phía máy chủ với các máy khách.
public ServerSocket (int port) throws IOException : khởi dựng đối tượng
ServerSocket được tạo ra trên máy chủ và lắng nghe ở cổng có số hiệu port
những kết nối từ phía máy khách gửi đến.
Socket accept() throws IOException: dừng lại và chờ đợi cho đến khi nhận
được thông tin kết nối sẽ trả về đối tượng socket của máy khách nơi có yêu cầu
nối vào máy chủ.
public void close() throws IOException: máy chủ cắt đứt mọi kết nối.
- Lớp DatagramSocket: cài đặt cho giao thức kết nối.
- Lớp DatagramPacket: mô tả chi tiết về nơi nhận và dữ liệu được gửi đi.
- Lớp SocketImpl: cài đặt cho Server Socket và Sorket.
- Lớp SocketImplFactory: một thể hiện cụ thể của SocketImpl.

2.2.2. RMI và lập trình phân tán hướng đối tượng trong Java:
2.2.2.1. Khái niệm chung.
Java RMI (Remote Method Invocation): Là một cơ chế gọi hàm từ xa đã
được thực hiện và tích hợp trong ngôn ngữ Java, là phương pháp lập trình hướng
đối tượng.
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.
Mô hình dưới đây cho thấy các đối tượng cho phép triệu gọi lẫn nhau. 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ộ, đâ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ựa vào giao thức triệu gọi từ xa RMI.
Lớp Khoa học máy tính – K11 (2009-2011)
12
Nhóm 8- Đề số 19
Lập trình mạng

2.2.2.2. Gọi phương thức từ xa và các vấn đề phát sinh
Triệu gọi phương thức từ xa phức tạp hơn triệu gọi phương thức cục bộ.
Các đối tượng trên hai Server khác nhau hoạt động trên hai tiến trình khác nhau
cho nên việc tham chiếu: Biến, địa chỉ đối tượng là khác nhau.
Ví dụ: Khi truyền con trỏ cho một phương thức ở xa, trên máy đang sử
dụng sẽ tồn tại nhưng trên Server khác (nơi đố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 cho con trỏ.
Trên máy cục bộ: lời gọi hàm, các tham số truyền cho hàm thường được đặt
vào ngăn xếp (stack).
Tham số truyền cho phương thức của đối tượng ở xa được đóng gói và
chuyển qua mạng để đến được phương thức thực sự.

2.2.2.3. Vai trò các lớp trung gian STUB và SKELETION.
Hình vẽ dưới biểu thị: Gọi phương thức từ xa các đối tượng thông qua lớp
trung gian. Đối tượng Java trên hai máy khác nhau không gọi nhau trực tiếp mà
thông qua lớp trung gian.
Lớp trung gian này tồn tại ở hai phía : máy khách (nơi gọi phương thức của
đối tượng ở xa) và máy chủ (nơi đối tượng thực sự được cài đặt để thực thi mã
lệnh của phương thức).
Phía máy khách lớp trung gian này được gọi lớp móc (stub).
Phía máy chủ lớp trung gian gọi lớp nối (skeletion).
Lớp Khoa học máy tính – K11 (2009-2011)
13
Nhóm 8- Đề số 19
Lập trình mạng

2.2.2.4. Cài đặt ứng dụng phân tán của RMI
Hình vẽ biểu thị: Triệu gọi đối tượng RMI giữa Server2 và Server1. Đối
tượng Calculator/Server2 sẽ được gọi bởi đối tượng CalculatorClient/Server1.
Chúng ta xây dựng lớp đối tượng Calculator với đặc tả interface như sau:
public interface Calculator {
public int addNumber(int x, int y);}
Phương thức addNum() được dùng để cộng 2 tham số x, y với nhau và trả
về kết quả cho đối tượng nào gọi nó.
2.2.2.5. Cơ chế gọi hàm từ xa của các đối tượng RMI một cách tổng
quát
- Đối tượng cài đặt các phương thức và gọi hàm Naming.bind() để đăng ký với
rmiregistry/Server chủ
Lớp Khoa học máy tính – K11 (2009-2011)
14
Nhóm 8- Đề số 19
Lập trình mạng


- Đối tượng trên máy khách muốn gọi phương thức của đối tượng trên máy chủ
trước hết gọi hàm Naming.lookup() để truy tìm tham chiếu đến đối tượng ở xa
theo tên.
- Bộ đăng ký rmiregistry sẽ trả về tham chiếu đến đối tượng ở xa thông qua giao
tiếp interface mà đối tượng ở xa cung cấp.
- Dựa vào interface đối tượng ở máy khách sẽ gọi các phương thức của đối
tượng trên máy chủ.
- Khi một phương thức được gọi, lời gọi sẽ được chuyển tiếp đến lớp trung gian
_Stub. Xử lý chuyển tham số của phương thức gọi đến _Skel trên máy chủ.
- Lớp trung gian _Skel trên máy chủ trực tiếp yêu cầu đối tượng thực thi
phương thức và chuyển trả kết quả về cho máy khách.
- Đặc tả lớp giao tiếp của đối tượng (Calculator.java)
- Dựa vào đặt tả cài đặt chi tiết đối tượng (CalculatorImpl.java).
- Biên dịch đối tượng (CalculatorImpl.class) và tạo ra 2 đối tượng trung gian
(CalculatorImpl_Stub và CalculatorImpl_Skel).
- Viết chương trình (CalculatorServer.class) cài đặt đối tượng trên máy chủ.
Lưu ý gọi phương thức UnicasRemoteObject. exportObject() để thông báo cho
Java nhận dạng được sự tồn tại của đối tượng ở dạng truy xuất được từ xa bởi
các đối tượng khác.
Lớp Khoa học máy tính – K11 (2009-2011)
15
Nhóm 8- Đề số 19
Lập trình mạng

- Sử dụng lớp giao tiếp (Calculator.class) và CalculatorImpl_Stub từ máy khách
để gọi phương thức của đối tượng trên máy chủ.
2.2.2.6. Bộ đăng ký (Registry)
Cơ chế làm việc của máy ảo Java khi đăng ký và gọi đối tượng giữa trình
khách và chủ.

Trên thực tế nếu hoạt động thực sự qua mạng thì chỉ có thể tách ra làm hai
máy vật lý. Hình dưới là cơ chế hoạt động của các máy ảo Java trên mô hình
máy mạng vật lý thực sự. Máy khách có địa chỉ IP truy xuất đến bộ đăng ký
rmiregistry của máy chủ có địa chỉ IP khác. Trên máy chủ có 2 máy ảo hoạt
động. Máy ảo A chạy chương trình rmiregistry và Máy ảo B chạy phần cài đặt
của đối tượng.
Lớp Khoa học máy tính – K11 (2009-2011)
16
Nhóm 8- Đề số 19
Lập trình mạng

PHẦN 2: THUẬT TOÁN LỒNG MỞ VÀ CHƯƠNG
TRÌNH
Bài toán: Xây dựng chương trình thể hiện quá trình yêu cầu và đáp ứng yêu
cầu của hệ phân tán.
Chương 1 Thuật giải
Begin
End
Lớp Khoa học máy tính – K11 (2009-2011)
17
Nhóm 8- Đề số 19
Khôi phục
D
S
D
S
D S
Nhận yêu
cầu
từ Client

Server 1
Truy vấn CSDL
cục bộ
Yc thỏa
Trạng thái ủy thác
Mởgiaodịch
1
Kết thúc
GD1
Trả kết quả
cho Client
Server 3
Truy vấn CSDL
cục bộ
ủy thác
Mởgiaodịch
3
Kết thúc
GD3
Trả kết quả
về Server2
Khôi phục
Khôi phuc
Yc thỏa
Server 2
Truy vấn CSDL
cục bộ
Yc thỏa
Trạng thái ủy thác
Mởgiaodịch

2
Kết thúc
GD2
Trả kết quả
về Server1
Lập trình mạng

Giả sử có 3 Server được nối với nhau chứa các cơ sở dữ liệu về thông tin
các loại hàng hóa.
- Tại máy khách, Client yêu cầu mua một mặt hàng với một số lượng nào
đó. Yêu cầu này sẽ được gửi đến 1 server nào đó do ta chọn - server1 chẳng hạn.
- Nếu tại server này đáp ứng được, thì sẽ thông báo cho Client biết.
- Nếu không, thì tiếp tục chuyển yêu cầu đến Server2, nếu Server2 đáp
ứng được thì gởi thông tin về Server1, Server1 chuyển về Client.
- Nếu Server2 không đáp ứng được thì chuyển yêu cầu đến Server3.
Server3 sẽ gửi thông báo (đáp ứng được hay không) về Server2, rồi Server2 trả
về Server1, và Server1 chuyển về Client.
Chương 2: Chương trình
/* Lớp cài đặt Client*/
//Client.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.JList;
import javax.swing.JComboBox;
import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
import java.sql.*;
import java.sql.Date;

public class Client extends javax.swing.JFrame implements ActionListener{
private JTextField jtfItemNo,jtfQuantity;
private JButton btnRequest,btnConnection;
private TextArea Item;
ServerInterface server;
JComboBox Server=new JComboBox();
JPanel contentPane;
JLabel lbel1=new JLabel();
JLabel lbel2=new JLabel();
JLabel lbel3=new JLabel();
JLabel lbel4=new JLabel();
JLabel lbel5=new JLabel();
JLabel lbel6=new JLabel();
public Client()
Lớp Khoa học máy tính – K11 (2009-2011)
18
Nhóm 8- Đề số 19
Lập trình mạng

{
super("Client");
contentPane = (JPanel) getContentPane();
contentPane.setLayout(null);
contentPane.setSize(new Dimension(460, 180));
//
//
//
lbel1.setText("Server");
lbel1.setBounds(new Rectangle(5, 5, 50, 22));
lbel1.setForeground(new Color(85, 116, 185));

lbel1.setFont(new Font("Times New Roman",Font.BOLD,14));
contentPane.add(lbel1);
Server.addItem("S1");
Server.addItem("S2");
Server.addItem("S3");
Server.setBounds(new Rectangle(60, 5, 50, 22));
contentPane.add(Server);
btnConnection=new JButton("Connection");
btnConnection.setBounds(new Rectangle(120, 5, 100, 22));
contentPane.add(btnConnection);
lbel2.setText("Item No:");
lbel2.setBounds(new Rectangle(5, 37, 60, 22));
lbel2.setFont(new Font("Times New Roman",Font.BOLD,14));
contentPane.add(lbel2);
jtfItemNo = new JTextField();
jtfItemNo.setBounds(new Rectangle(70, 37, 60, 22));
contentPane.add(jtfItemNo);
lbel3.setText("Quantity:");
lbel3.setBounds(new Rectangle(5, 69, 60, 22));
lbel3.setFont(new Font("Times New Roman",Font.BOLD,14));
contentPane.add(lbel3);
jtfQuantity = new JTextField();
jtfQuantity.setBounds(new Rectangle(70, 69, 60, 22));
contentPane.add(jtfQuantity);
btnRequest=new JButton("Request");
btnRequest.setBounds(new Rectangle(140, 69, 90, 22));
contentPane.add(btnRequest);
Lớp Khoa học máy tính – K11 (2009-2011)
19
Nhóm 8- Đề số 19

Lập trình mạng

lbel4.setText("Isn't quantity");
lbel4.setBounds(new Rectangle(5, 101, 150, 22));
lbel4.setFont(new Font("Times New Roman",Font.BOLD,14));
contentPane.add(lbel4);
lbel4.setVisible(false);
lbel5.setText("");
lbel5.setBounds(new Rectangle(160, 101, 150, 22));
lbel5.setFont(new Font("Times New Roman",Font.BOLD,14));
contentPane.add(lbel5);
Item=new TextArea();
Item.setBounds(new Rectangle(0, 143, 300, 50));
contentPane.add(Item);
btnRequest.setEnabled(false);
btnConnection.addActionListener(this);
btnRequest.addActionListener(this);
}
public boolean connection(String port){
boolean ok=false;
try{


server=(ServerInterface)Naming.lookup("rmi://127.0.0.1:"+port+"/Shop");
ok=true;

}catch(Exception e){
}
return ok;
}

public void actionPerformed(ActionEvent ae){
if(ae.getSource()==btnConnection){
String server=""+Server.getSelectedItem();
String port="9000";
if(server.equals("S2"))
port="9100";
if(server.equals("S3"))
port="9200";
if(connection(port)){
Server.setEnabled(false);
Lớp Khoa học máy tính – K11 (2009-2011)
20
Nhóm 8- Đề số 19
Lập trình mạng

btnConnection.setEnabled(false);
btnRequest.setEnabled(true);
}else{
JOptionPane.showMessageDialog(this,"Error
Connection", "Error",1,new ImageIcon("about.jpg"));
}
}
if(ae.getSource()==btnRequest){
lbel4.setVisible(false);
Item.setText("");
String itemNo=jtfItemNo.getText();
String quantity=jtfQuantity.getText();
if(itemNo.equals("")||quantity.equals("")){
JOptionPane.showMessageDialog(this,"Input Information",
"Error",1,new ImageIcon("about.jpg"));

}
try{
int qt=Integer.parseInt(quantity);
Vector ItemInfor=new Vector();
Vector DataInforLast=server.Request(itemNo,qt);
String PortII=""+DataInforLast.get(0);
if(PortII.equals("9000"))
lbel5.setText("Server 1");
if(PortII.equals("9100"))
lbel5.setText("Server 2");
if(PortII.equals("9200"))
lbel5.setText("Server 3");
Vector DataInfor=(Vector)DataInforLast.get(1);
String Item1=""+DataInfor.get(0);
String quantity1=""+DataInfor.get(1);
if(Item1.equals("1")){
if(quantity1.equals("1"))
lbel4.setVisible(true);
ItemInfor=(Vector)DataInfor.get(2);
String ItemInfor2=""+ItemInfor.get(0)+" |
"+ItemInfor.get(1)+" | "+ItemInfor.get(2)+" | "+ItemInfor.get(3);
Item.setText(ItemInfor2);
}else{
JOptionPane.showMessageDialog(this,"No
Item", "Error",1,new ImageIcon("about.jpg"));
Lớp Khoa học máy tính – K11 (2009-2011)
21
Nhóm 8- Đề số 19
Lập trình mạng


}
}catch(Exception e){
}
}
}
public static void main(String args[]){
Client cl=new Client();
cl.setSize(300,240);
cl.setVisible(true);
/* try{

ServerInterface
server=(ServerInterface)Naming.lookup("rmi://127.0.0.1:9999/Sho
p");
System.out.println(server.Request("ch",6));

}catch(Exception e){
}*/
}
}
// DataAccessShop.java
import java.sql.*;
import java.util.Vector;
import java.io.*;
import java.lang.*;
import java.lang.Object;
import java.lang.String;
import java.util.*;
import java.math.*;
public class DataAccessShop{

Connection cn = null;
String database;
// CONSTRUCTOR
public DataAccessShop(String data)
{
this.database=data;
Lớp Khoa học máy tính – K11 (2009-2011)
22
Nhóm 8- Đề số 19
Lập trình mạng

}
// CONNECT
public void Connect()
{
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//driver
cn =
riverManager.getConnection("jdbc:odbc:"+this.database);//url
}
catch(Exception e){
System.out.println("Connect Error: "+e);
}
}
// DISCONNECT
public void Disconnect(){
try
{
cn.close();
}

catch (Exception e)
{
System.out.println("Disconnect Error: "+e);
}
}
// Lay thong tin Hang hoa
public Vector Request(String itemNo, int Quantity){
int item_No=0;
int qtity=0;
Connect();
String sql;
sql="Select * from ShopItem";
sql+=" where ItemNo='"+itemNo+"'";
Vector ItemInfo=new Vector();
try
{
Statement stmt = cn.createStatement();
stmt.execute(sql);
ResultSet rs=stmt.getResultSet();
Vector row=new Vector();
while(rs.next())
Lớp Khoa học máy tính – K11 (2009-2011)
23
Nhóm 8- Đề số 19
Lập trình mạng

{
item_No=1;
row.add(""+rs.getString(1));
row.add(""+rs.getString(2));

String quantity1=rs.getString(3);
if(Double.parseDouble(quantity1)<Quantity)
qtity=1;
row.add(""+quantity1);
row.add(""+rs.getString(4));
}
ItemInfo.add(""+item_No);
ItemInfo.add(""+qtity);
ItemInfo.add(row);
rs.close();
stmt.close();
}catch(Exception ae)
{
System.out.println("loi: "+ae);
}
return ItemInfo;
}
}
//ServerImpl.java
import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.util.Vector;
import java.sql.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class ServerImpl implements ServerInterface{

static int port;
Lớp Khoa học máy tính – K11 (2009-2011)
24
Nhóm 8- Đề số 19
Lập trình mạng

static String Par;
int PORT=0;
static DataAccessShop da = null;
ServerInterface serverI;
public ServerImpl(){
}
public static void main(String args[]){
port=Integer.parseInt(args[0].toString());
Par=args[1].toString();

try{
ServerImpl server=new ServerImpl();
server.PORT=port;
UnicastRemoteObject.exportObject(server);
LocateRegistry.createRegistry(port);
Naming.rebind("rmi://127.0.0.1:"+port+"/Shop",server);
if(port==9000)
System.out.println("Server 1");
if(port==9100)
System.out.println("Server 2");
if(port==9200)
System.out.println("Server 3");
}catch(Exception e){
e.printStackTrace();

}
da= new DataAccessShop(Par);
}
public boolean connectionServer(int port){
boolean ok=false;
try{


serverI=(ServerInterface)Naming.lookup("rmi://127.0.0.1:"+port+"/Shop");
ok=true;

}catch(Exception e){
System.out.println("Loi ket noi Server: "+port);
}
return ok;
}
public Vector RequestServer(int PortI,String itemNo, int Quantity){
Lớp Khoa học máy tính – K11 (2009-2011)
25
Nhóm 8- Đề số 19

×