ĐẠI HỌC ĐÀ NẴNG
======
TIỂU LUẬN
LẬP TRÌNH MẠNG
Đề tài:
ĐẢM BẢO GẮN BÓ DỮ LIỆU KHI CẬP NHẬT
TRONG CÁC CƠ SỞ DỮ LIỆU TẬP TRUNG TẠI
CÁC NGÂN HÀNG
GVHD: TS. Lê Văn Sơn
Sinh viên: Lê Công Võ
Lê Vũ Ngọc Anh
Chuyên ngành: Khoa học máy tính_ Khóa 11
Đà Nẵng, tháng 03/2010
Trang 1
MỞ ĐẦU
Ngày nay các ứng dụng công nghệ thông tin được ứng dụng một cách rộng rãi
trong nhiều lĩnh vực, nhiều ngành nghề khác nhau. Những ứng dụng mạng là những
ứng dụng quang trọng trong cuộc sống, những ứng dụng phân tán là một trong số
những ứng dụng quan trọng trong công nghệ thông tin.
Hệ tin học phân tán là một trong những lĩnh vực tri thức vừa mang tính chất cơ sở
vừa mang tính chất tiên tiến của chuyên ngành công nghệ thông tin mà việc nắm bắt
và vận dụng tốt các nguyên lý của nó sẽ mang lại cho các hê thống thực tiễn những
hứa hẹn rất lớn về hiệu năng khai thác thiết bị trong các ứng dụng tin học. Nó còn là
hệ thống tin học hiện đại, đa dạng, phức tạp và đang trên đà phát triển, được nhiều
trường đại học, nhiều viện nghiên cứu, nhiều chuyên gia công nghệ thông tin, quan
tâm nghiên cứu với nhiều công trình khoa học có giá trị về mặt nguyên lý, phương
pháp cũng như ứng dụng trong thực tế.
Việc lập trình giải quyết một bài toán hay giải quyết một yêu cầu xử lý phân tán
các đối tượng vẫn là một vấn đề nóng bỏng của công nghệ ngày nay. Trong khuôn khổ
môn học Lập trình mạng phân tán, tiểu luận trình bày về vấn đề lập trình phân tán giải
quyết một bài toán cụ thể, đó là:
Computer A
A2
A1
Computer C
C1
C2
Computer B
B1
C3
1.2. Gọi phương thức từ xa và các vấn đề phát sinh
Việc gọi phương thức của đối tượng từ xa thoạt nhìn có vẻ đơn giản nhưng thực
tế lại 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 máy khác
nhau hoạt động trên hai tiến trình (hay không gian địa chỉ) khác nhau cho nên việc
tham chiếu biến, địa chỉ đối tượng là hoàn toàn khác nhau. Ví dụ, khi bạn truyền con
trỏ cho một phương thức ở xa, trên máy bạn con trỏ này tồn tại nhưng trên máy khác
(nơi có đối tượng thực thi phương thức) sẽ không có bất kỳ vùng nhớ nào được cấp
phát dành cho con trỏ. Lời gọi các phương thức cục bộ thường luôn trả về kết quả
trong khi lời gọi các phương thức từ xa phải thông qua kết nối mạng và luôn có thể bị
ngắt ngang do mạng gặp sự cố.
Đối với lời gọi hàm trên máy cục bộ, các tham số truyền cho hàm thường được đặt vào
ngăn xếp (stack) trong khi tham số truyền cho phương thức của các đối tượng ở xa
phải được đóng gói và chuyển qua mạng để đến đươc với phương thức thực sự.
1.3. Vai trò các lớp trung gian (Stub và Skeletion)
Để giải quyết các vấn đề trên, đố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 ở cả hai phía
máy khách (Client - nơi gọi phương thức của đối tượng ở xa) và máy chủ (Server – 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à Stub (lớp móc), phía máy chủ lớp trung gian này được
gọi là Skeletion (lớp nối).
Hình 1 – 2: Gọi phương thức của các đối tượng thông qua lớp trung gian
Định danh đối tượng từ xa cần sử dụng
Mô tả về phương thức cần triệu gọi
Mã hoá các tham số và truyền cho Skel.
Stub sẽ chuyển những thông tin trên cho máy chủ. Ở phía máy chủ, đối tượng Skel
nhận thực hiện những công việc sau để gọi phương thức từ xa:
Giải mã các tham số
Xác định đối tượng để thực hiện lời gọi hàm tương ứng
Thực hiện lời gọi phương thức theo yêu cầu
Tập hợp kết quả để trả lời hoặc thông báo các lỗi ngoại lệ
Gửi trả lời gói các dữ liệu kết quả cho Stub ở trên máy khách.
1.4. Cài đặt ứng dụng phân tán RMI
Sau đây là một ví dụ về cách làm việc của các đối tượng RMI. Chương trình là một
hệ đối tượng phân tán (hình 1 – 3). Đối tượng Calculator chạy trên máy tính Computer
2 sẽ được gọi bởi đối tượng CalculatorClient chạy trên máy tính Computer 1.
Hình 1-3: Triệu gọi đối tượng RMI giữa trình khách (Client) và
đối tượng chủ (Server) ở xa
Trang 5
Computer 1
CalculatorClient
Calculator_Stub
Computer 2
Calculator
Calculator_Skel
RMI
Muốn Calculator có khả năng giao tiếp được với các đối tượng ở xa thì phải báo cho
Java biết Calculator là một đối tượng có khả năng Remote. Tất cả các phương thức
trong giao tiếp Calculator muốn được gọi từ xa đều phải có khả năng ném ra ngoại lệ
RemoteException vì khi triệu gọi từ xa có rất nhiều nguyên nhân làm nó thất bại,
ví dụ, máy chủ, kết nối mạng không sẵn sàng và nhiều vấn đề không bình thường,
ngoại lệ khác gặp phải trên mạng. Mã nguồn đầy đủ của giao tiếp Calculator như sau:
try{
//Tạo đối tượng Calculator thật sự
CalculatorImpl c=new CalculatorImpl();
System.out.println(“Exporting Calculator…”);
//Thông báo sư hiện diện của đối tượng cho máy ảo Java
UnicastRemoteObject.exportObject(c);
//đăng ký đối tượng với bộ quản lý rmi
System.out.println(“Register Calculator!”);
Trang 6
}catch (Exception){
System.out.println(e);
}
}
}
Chương trình Calculator làm việc như sau:
- Đối tượng CalculatorImpl được tạo ra
CalculatorImpl c=new CalculatorImpl();
- Calculator gọi phương thức tĩnh exportObject() của lớp
UnicastRemoteObject để máy ảo Java nhận diện được đối tượng c (Calculator) là đối
tượng có khả năng truy xuất từ xa.
UnicastRemoteObject.exportObject(c);
- Đặt cho đối tượng Calculator một tên gợi nhớ và đăng ký tên này với bộ
quản lý rmi. Phương thức tĩnh bind() của lớp Naming sẽ thực hiện điều này:
Naming.bind(“rmi://localhost/MyCalculator”, c);
Phương thức bind() nhận hai đối số: đối số thứ nhất là chuỗi định vị URL và đối số
thứ hai là bản thân đối tượng cần đăng ký. Chuỗi URL có định dạng như sau:
rmi://hostname:port/Object
rmi là tên giao thức dùng để đăng ký; hostname, port là địa chỉ IP và số hiệu
cổng của máy chủ nơi bộ đăng ký đối tượng rmi đang chạy. Objectname là tên gợi
nhớ bất kỳ đặt cho đối tượng. Các chương trình máy khách sẽ dựa vào tên này để truy
bộ quản lý rmiregistry trên máy chủ.
2. Đố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 cần gọi hàm Naming.lookup() để truy tìm tham chiếu đến đối
tượng ở xa theo tên.
3. Bộ đăng ký rmiregistry sẽ trả về tham chiếu đến đối tượng ở xa thông qua lớp
giao tiếp interface mà đối tượng ở xa cung cấp.
4. Dựa vào lớp giao tiếp 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ủ.
5. Khi một phương thức được gọi, lời goi 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 lớp_Skel trên máy
chủ.
6. Lớp trung gian_Skel trên máy chủ sẽ 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ác bước cài đặt và thiết
kế đối tượng RMI có thể được tóm tắt như sau:
7. Đặc tả lớp giao tiếp của đối tượng (Calculator.java)
8. Dựa vào lớp đặc tả cài đặt chi tiết đối tượng (CalculatorImpl.java)
9. Biên dịch đối tượng (CalculatorImpl.class). Dựa vào đối tượng vừa cài
đặt dùng trình rmi.exe (chương trình này nằm trong thư mục \jdk.3\bin) tạo ra
hai lớp trung gian Calculator_Stub và Calculator_Skel.
10.Viết chương trình (CalculatorServer.class) cài đặt đối tượng trên máy
chủ. Chú ý phải gọi phương thức UnicastRemoteObject.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.
11.Sử dụng lớp giao tiếp (Calculator.class) và CalculatorImpl_Stub từ
máy khách để gọi các phương thức của đối tượng trên máy chủ.
Trang 8
Hình 1-4: Cơ chế RMI gọi phương thức của đối tượng từ xa
Khi chạy chương trình Java dựa vào biến môi trường CLASSPATH để truy tìm các
tâp tin .class. Chương trình minh họa bao gồm các tập tin sau:
transfer, đăng nhập từ xa (remote login), truy tìm các trang Web… Những dịch vụ này
đươc tổ chức và kiến trúc theo mô hình khách/ chủ (Client/ Server). Các chương trình
ở máy khách (client) sẽ tạo ra kết nối (connection) với một máy chủ ở xa (server) sau
đó gửi các yêu cầu đến máy chủ, các chương trình dịch vụ trên máy chủ sẽ xử lý các
yêu cầu này và gửi kết quả ngược về cho máy khách. Thông thường một dịch vụ trên
máy chủ phục vụ cho rất nhiều máy khách.
Trang 9
Computer 1
Computer 2
CalculatorClient
Calculator
CalculatorImpl_Stub
CalculatorImpl
rmiregistry
CalculatorImpl_Skel
1.5.2. Lập trình mạng thông qua Socket
Trước khi yêu cầu một dịch vụ trên máy chủ thực hiện điều gì đó, máy khách
(client) phải có khả năng kết nối được với máy chủ (server). Quá trình kết nối này
được Java thực hiện thông qua môt cơ chế trừu tượng hóa gọi là Socket (tạm dịch là
“cơ chế ổ cắm”).
Nếu kết nối socket thành công thì máy khách và máy chủ có thể trao đổi sữ liệu với
nhau thực hiện các yêu cầu về dịch vụ trên máy chủ. Việc kết nối theo cơ chế socket
cần biết hai thông tin chủ yếu đó là địa chỉ của máy cần kết nối và số hiệu cổng của
chương trình dịch vụ. Java cung cấp lớp Socket (thường được dùng cho máy khách)
và lớp ServerSocket (thường được đặt trên máy chủ). Hai lớp này được đăt trong
try{
Trang 10
Socket me=new Socket(“my.testing.server”, 1234);
//Luồng nhập để đọc thông tin trả về từ máy chủ kết nối
DataInputStream in =
New DataInputStream(me.getInputStream());
//Luồng xuất để ghi thông tin gửi đến máy chủ
DataOutputStream out=new DataOutputStream(me.getOutputStream());
Catch (Exception e){
System.out.println(e);
}
1.5.4. Lớp ServerSocket
Lớp ServerSocket dùng tao kết nối từ phía máy chủ với các máy khách. Đối
tượng ServerSocket được tạo ra trên máy chủ và lắng nghe những kết nối từ phía máy
khách gửi đến theo một số cổng định trước. Đối tượng ServerSocket được khởi dựng
từ phương thức sau:
• Public ServerSocket(int port)throws IOEXception
port là số hiệu cổng mà đối tượng ServerSocket phải lắng nghe để nhận biết những kết
nối từ phía máy khách gửi đến.
Để chờ đợi kết nối từ các máy khách gửi đến đối tương ServerSocket thường đến phương
thức accept như sau:
• Socket accept()throws IOEXception
Phương thức này thực sự dừng lại 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ủ.
Cuối cùng máy chủ có thể cắt đứt mọi kết nối bằng cách gọi phương thức close của đối
tượng ServerSocket:
• Public void close()throws IOEXception
Ví dụ đoạn mã sau sẽ tạo ra một đối tượng ServerSocket trên máy chủ luôn lắng
nghe kết nối từ máy khách gửi đến qua số cổng 1234
try{
Server; Tình trạng của Server (Có khả năng đáp ứng hay từ chối yêu cầu của Client
(quá tải)…
Hệ thống chỉ từ chối yêu cầu của các Client khi quá tải, các yêu cầu từ các
Client khác vẫn được phục vụ bình thường. Khi hệ thống giảm tải (do các Client
không yêu cầu tài nguyên nữa) thì các Client khác có thể sử dụng tài nguyên hệ thống
bình thường.
2.2. Tổ chức chương trình
Chương trình sử dụng cơ chế đa luồng và socket trong java để thiết lập kết nối từ
Client đến Server để trao đổi thông tin:
Trang 12
Server
Client 1
Client n
Socket lắng nghe trên cổng
Một socket
cho một client
Kết nối qua socket
Chương trình trên Server :
Hoạt động như một bộ phân phối tải tổng quát, tạo ra các cổng (Socket) cho
phép Client kết nối đến, lắng nghe yêu cầu kết nối của Client qua các cổng, chấp nhận
hay từ chối yêu cầu cung cấp dịch vụ từ Client tùy theo tình trạng của mạng.
Chương trình trên Client:
Client có nhiệm vụ nhập vào số tiền cho tài khoản, kết nối với Server, gởi số
tiền cho Server yêu cầu Server tính giá trị trong tài khoản và nhận kết quả từ Server.
Chương trình sử dụng vòng lặp để tạo ra n Client cho phép kết nối đồng thời tới
Server.
Trang 13
KẾT LUẬN
Qua thời gian tìm hiểu về lập trình phân tán nói chung và thực hiện bài toán đảm
bảo gắn bó khi cập nhật trong các CSDL tập trung tại các ngân hàng, đề tài đã đạt
2.2. Tổ chức chương trình 12
KẾT LUẬN 14
Trang 16