tiểu luận lập trình mạng phân tán đả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 - Pdf 25

Tiểu luận: Lập trình mạng
ĐẠI HỌC ĐÀ NẴNG
======
TIỂU LUẬN
LẬP TRÌNH MẠNG PHÂN TÁN
Đề 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: PGS.TS. Lê Văn Sơn
Học viên: Đỗ Trường Linh
Chuyên ngành: Khoa học máy tính_ Khóa 24
Học viên: Đỗ Trường Linh Trang 1
Tiểu luận: Lập trình mạng
MỞ ĐẦU
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à:
Viết chương trình đảm bảo gắn bó dữ liệu khi cập nhật trong các CSDL tập
trung tại các ngân hàng.
Bài làm này tìm hiểu và vận dụng JAVA để lập trình giải quyết bài toán theo hai
cách là sử dụng đa tuyến và giả lập server. Trong đó giả lập server theo hướng một

A1
Computer C
C1
C2
Computer B
B1
C3
Tiểu luận: Lập trình mạng
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
Ví dụ, đối tượng C1 được cài đặt chạy trên máy C. Trình Java sẽ tạo ra hai lớp

 Đị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
Học viên: Đỗ Trường Linh Trang 5
Computer 1
CalculatorClient
Calculator_Stub
Computer 2
Calculator
Calculator_Skel
RMI
Tiểu luận: Lập trình mạng
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,

public class CalculatorServer {
public static void main(String args[]){
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!”);
Học viên: Đỗ Trường Linh Trang 6
Tiểu luận: Lập trình mạng
}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

CalculatorImpl_Skel.class để cài đặt đối tượng; máy client chỉ cần dùng đến lớp
Calculator.class và CalculatorImpl_Stub.class để gọi phương thức của đối tượng.
Hình 1-4 diễn đạt cơ chế gọi hàm từ xa của các đối tượng RMI một cách tổng quát:
1. Đối tượng cài đặt các phương thức và gọi hàm Naming.bind() để đăng ký với
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ủ.
Học viên: Đỗ Trường Linh Trang 8

Máy chủ
Máy khách
Học viên: Đỗ Trường Linh Trang 9
Computer 1



Computer 2


CalculatorClient
Calculator
CalculatorImpl_Stub
CalculatorImpl
rmiregistry
CalculatorImpl_Skel
Tiểu luận: Lập trình mạng
CHƯƠNG 2
GIAO TIẾP THEO MÔ HÌNH CLIENT/SERVER
VÀ KHÁI NIỆM SOCKET
2.1. Giao tiếp theo mô hình khách/ chủ (Client/ Server)
Có rất nhiều dịch vụ hỗ trợ trên Internet như e-mail, nhóm tin (newgroup), file
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.
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

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ủ.
Ví dụ đoạn mã sau sẽ thực hiện kết nối với máy chủ có địa chỉ
“my.testing.server” và mở ra hai luồng xuất nhập để đọc và gửi thông tin đến
máy chủ có theo số cổng 1234:
try{
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);
}
2.3. 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:

BẰNG NGÔN NGỮ JAVA
3.1. Mô tả yêu cầu của bài toán
Bài toán xây dựng một bộ phân phối tải (Bộ cung cấp tài nguyên - Server). Bộ
cung cấp tài nguyên căn cứ vào tài nguyên hiện có của mạng (Khả năng đáp ứng yêu
cầu dịch vụ của Client) mà chấp nhận phục vụ hay từ chối yêu cầu cung cấp dịch vụ
từ Client.
Yêu cầu dịch vụ từ Client ở đây được mô tả bằng cách Client gởi số tiền hoặc
rút tiền ra từ tài khoản (cập nhật ngẫu nhiên ) đến Server, yêu cầu Server kiểm tra tài
khoản gửi đến và gởi trả lại số tiền hiện tại trong tài khoản.
Trong quá trình vận hành hệ thống, Server phải biết được tình trạng hiện tại của
hệ thống như: Số Client yêu cầu cung cấp dịch vụ hiện tại; Số thông điệp (Message)
của các Client đã gởi đến cho Server; Client nào đã kết thúc yêu cầu kết nối đến
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.
3.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:
Học viên: Đỗ Trường Linh Trang 13
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
Tiểu luận: Lập trình mạng

for ( int i = 0; i < 10 ; i++ ) {
account = new Account(String.valueOf(i), 0);
accounts.put(String.valueOf(i), account);
}
ServerSocket s = new ServerSocket(port, maxConnection);
while (true) {
Socket client = s.accept();
Runnable r = new BankService(client, accounts);
Thread t = new Thread(r);
t.start();
}
}
catch (IOException ioe) {
ioe.printStackTrace();
Học viên: Đỗ Trường Linh Trang 14
Tiểu luận: Lập trình mạng
}
}
}
/** BankService.java
import java.io.*;
import java.net.*;
import java.util.*;
public class BankService implements Runnable {
Socket client;
HashMap accounts;
/*
* constructor
*/
public BankService(Socket client, HashMap accounts) {

s[1] = line.substring(index + 1, line.length());
account = (Account) accounts.get(s[0]);
account.deposit(Integer.parseInt(s[1]));
}
else if ((index = line.indexOf('-')) != -1 ) {
// accountID
s[0] = line.substring(0, index);
// so tien (atm)
s[1] = line.substring(index + 1, line.length());
account = (Account) accounts.get(s[0]);
isSuccess = account.withdraw(Integer.parseInt(s[1]));
}
String logMsg = null;
if ( isSuccess ) {
// thao tac xu ly thanh cong
logMsg = "So du cua tai khoan [" + s[0] + "] la: " +
account.getBalance();
}
else {
// thao tac thuc hien khong thanh cong
logMsg = "Ban khong the rut tien tu tai khoan [" +
s[0] + "]: So du tai khoan phai lon hon so tien can rut";
}
out.println(logMsg);
out.flush();
System.out.println(logMsg);
}
}
}
catch (IOException ioe) {

}
/*
* thiet lap so tai khoan moi
*/
public void setBalance(int balance) {
this.balance = balance;
}
/*
* gui tien (amt) vao tai khoan
*/
public synchronized boolean deposit(int amt) {
balance += amt;
return true;
}
/*
* rut tien ra khoi tai khoan
*/
public synchronized boolean withdraw(int amt) {
if (amt > balance) {
System.out.println("Khong the rut tien !");
return false;
}
else {
balance -= amt;
return true;
}
}
}
Học viên: Đỗ Trường Linh Trang 17
Tiểu luận: Lập trình mạng

id = Integer.parseInt(args[2]);
}
catch (NumberFormatException nfe){
System.out.println("id error");
}
try{
operator = args[3].charAt(0);
}
catch (NumberFormatException nfe){
System.out.println("operator error");
}
Học viên: Đỗ Trường Linh Trang 18
Tiểu luận: Lập trình mạng
try{
value = Integer.parseInt(args[4]);
}
catch (NumberFormatException nfe){
System.out.println("value error");
}
try{
AccountClient accountClient = new AccountClient(host,
port,String.valueOf(id) ,operator, value, (int) id);
Thread t = new Thread(accountClient);
t.start();
}
catch (Exception e) {
System.err.println(e);
}
}
}

StringBuffer msg = new StringBuffer();
msg.append(accountID);
msg.append(operator);
msg.append(String.valueOf(atm));
switch (random % 5) {
case 0:
Thread.sleep(40);
break;
case 1:
Thread.sleep(24);
break;
case 2:
Thread.sleep(35);
break;
case 3:
Thread.sleep(15);
break;
case 4:
Thread.sleep(10);
}
out.println(msg);
out.flush();
String result = in.nextLine();
System.out.println("msg from server: " + result);
out.println("exit");
out.flush();
}
catch (Exception e) {
System.err.println(e);
}

các bạn quan tâm để đề tài được hoàn thiện hơn.
TÀI LIỆU THAM KHẢO
1. Hệ tin học phân tán – TS. Lê Văn Sơn, NXB Đại học quốc gia TP HCM- 2002.
2. Java lập trình mạng - Nguyễn Phương Lan, Hoàng Đức Hải- NXB Lao động xã hội
– 2006.
3. Giáo trình lý thuyết và bài tập Java – Trần Tiến Dũng – NXB Giáo dục.
4. DISTRIBUTED SYSTEMS – CONCEPTS AND DESIGN – George Coulouris,
Jean Dollimore and Tim Kindberg
5. Lập trình hướng đối tượng với Java- Ts. Đoàn Văn Ban – Nhà xuất bản khoa học
và kỹ thuật – 2005.
Học viên: Đỗ Trường Linh Trang 22
Tiểu luận: Lập trình mạng
MỤC LỤC
MỞ ĐẦU 2
CHƯƠNG 1 3
TÌM HIỂU VỀ LẬP TRÌNH PHÂN TÁN TRONG JAVA 3
1.1. RMI và lập trình phân tán đối tượng 3
1.2. Gọi phương thức từ xa và các vấn đề phát sinh 4
1.3. Vai trò các lớp trung gian (Stub và Skeletion) 4
1.4. Cài đặt ứng dụng phân tán RMI 5
CHƯƠNG 2 10
CHƯƠNG 3 13
BÀI TOÁN ĐẢM BẢO GẮN BÓ DỮ LIỆU KHI CẬP NHẬT TRONG CÁC CSDL
TẬP TRUNG TẠI CÁC NGÂN HÀNG BẰNG NGÔN NGỮ JAVA 13
3.1. Mô tả yêu cầu của bài toán 13
3.2. Tổ chức chương trình 13
Chương trình Client: 21
21
KẾT LUẬN 22
Học viên: Đỗ Trường Linh Trang 23


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status