Tải bản đầy đủ (.pdf) (47 trang)

Bài giảng lập trình ứng dụng mạng bài 4 GV võ tấn dũng

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 (436.29 KB, 47 trang )

TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM

LẬP TRÌNH ỨNG DỤNG MẠNG

BÀI 4

CORBA

(Common Object Request Broker Architecture)

GIẢNG VIÊN:

VÕ TẤN DŨNG


PHẦN 1

GV: Võ Tấn Dũng

CÁC KHÁI NIỆM


KHÁI NIỆM CORBA

3

GV: Võ Tấn Dũng

• Các nhà lập trình luôn mong muốn tìm được một tiếng nói
chung cho tất cả các ngôn ngữ lập trình hiện có.
• CORBA (kiến trúc môi giới các đối tượng chung) được


hình thành từ một tổ chức nghiên cứu quốc tế OMG
(Object Management Group). Tham vọng của OMG là đưa
ra cách để các đối tượng viết bằng những ngôn ngữ khác
nhau có thể gọi lẫn nhau theo mô hình đối tượng phân
tán.
• CORBA không phải là một ngôn ngữ lập trình, CORBA là
một ngôn ngữ đặc tả giao tiếp (IDL-Interface Description
Language)


NGÔN NGỮ ĐẶC TẢ
• Các ngôn ngữ lập trình khác nhau thường có một điểm
chung đó chính là lời gọi thủ tục, hàm, kiểu dữ liệu, tham
số truyền vào hàm, trị trả về của hàm. Điều đầu tiên khi cài
đặt hàm là phải khai báo hàm.

• Người ta có ý tưởng dùng một ngôn ngữ khái quát để đặc
tả các hàm trên rồi dùng một công cụ dịch hàm sang một
ngôn ngữ cụ thể.
4

GV: Võ Tấn Dũng

• Ví dụ:
Trong C/C++: int get_price(char * product)
Trong Basic: function get_price(product as string) as integer
Trong Java: public static int get_price(String product)


• CORBA quy định một tập hợp các mô tả hàm, kiểu dữ

liệu, cách khai báo để đặc tả đối tượng. Đặc tả đối tượng
cũng giống như khái niệm giao tiếp interface trong Java.
Nó chỉ mô tả chức năng của đối tượng thông qua hàm,
phương thức, thuộc tính,… mà không có bất kỳ cài đặt mã
lệnh nào trong ngôn ngữ đặc tả. Chính vì vậy mà CORBA
còn được gọi là ngôn ngữ đặc tả giao tiếp IDL.
• CORBA cung cấp một số tiện ích để dịch một đặc tả sang
một ngôn ngữ lập trình nào đó.
• Ví dụ:
idl2cpp để dịch sang ngôn ngữ C
idl2pas để dịch sang ngôn ngữ Pascal
idlj (idl2java) để dịch sang ngôn ngữ Java
5

GV: Võ Tấn Dũng

IDL TRONG CORBA


IDL ÁNH XẠ SANG JAVA
Bảng ánh xạ giữa IDL và Java:
JAVA

module
interface
constant
boolean
char, wchar
octet
string, wstring

short, unsigned short
long, unsigned long
long long, unsigned long long
float
double
enum, struct, union
sequence, array
exception
operation

package
Interface
public static final
boolean
char
byte
String
short
int
long
float
double
class
array
class
method

- Để chuyển từ interface của
Java sang IDL ta dùng lệnh:
rmic –idl YourObject.class

- Để chuyển từ một đặc tả IDL
sang một interface của Java ta
dùng lệnh:
idlj YourObject.idl

6

GV: Võ Tấn Dũng

IDL CORBA


PHẦN 2

GV: Võ Tấn Dũng

CORBA VÀ MÔ HÌNH
PHÂN TÁN


ORB(Object Request Broker)
chương trình môi giới trung gian

Java
CORBA
Object

8

GV: Võ Tấn Dũng


Internet /
Mạng

IDL

ORB

IDL

C++
CORBA
Object

ORB

• Các đối tượng sau khi được viết bằng những ngôn ngữ
lập trình khác nhau muốn gọi được lẫn nhau phải thông
qua một trình môi giới trung gian của CORBA là ORB
• ORB được xây dựng độc lập với máy ảo Java (JMV). Tuy
nhiên từ Java 1.2 máy ảo Java đã nhúng luôn khả năng
ORB và xem như nó là một phần của Java chuẩn.


CƠ CHẾ LÀM VIỆC CỦA ORB
• ORB cũng dùng khái niệm lớp trung gian Stub và Skel tương tự như
cách làm việc của các đối tượng trong RMI. Thật sự thì Stub và Skel
được sinh ra từ trình biên dịch dựa vào đặc tả IDL. Ta không cần phải
viết mã lệnh cho lớp Stub và Skel
Máy Client


Máy Sever

C++
Client

Java
CORBA

Lớp trung gian
Stub

Lớp trung gian
Skel
giao thức IIOP

Lời gọi đối tượng trên lý thuyết
Lời gọi đối tượng thực tế

ORB
9

GV: Võ Tấn Dũng

ORB

Object X


QUY TRÌNH XÂY DỰNG ỨNG DỤNG CORBA

TRÊN MÁY CHỦ:

• Đặc tả đối tượng X bằng ngôn ngữ IDL của CORBA.
• Chuyển đặc tả X thành mô tả của một ngôn ngữ cụ thể (ví dụ dùng
trình biên dịch idlj.exe để chuyển đặc tả của X sang ngôn ngữ Java).
Dựa vào đặc tả IDL yêu cầu trình biên dịch tạo ra lớp trung gian Skel.
• Cài đặt đối tượng X bằng ngôn ngữ Java.
• Sử dụng đặc tả IDL của đối tượng X yêu cầu trình biên dịch tạo ra lớp
trung gian Stub. Tùy theo ngôn ngữ muốn viết ở máy khách mà ta sử
dụng trình biên dịch thích hợp
• Khi trình khách gọi đối tượng chủ, thực tế lời gọi sẽ chuyển qua lớp
Stub trên máy khách, gởi đến trình môi giới ORB. Trình ORB trên máy
khách sẽ kết nối với trình ORB trên máy chủ theo giao thức IIOP. Trình
ORB trên máy chủ chuyển lời gọi cho lớp trung gian Skel trên máy chủ.
Cuối cùng đối tượng CORBA trên máy chủ sẽ thực thi phương thức
của nó.
10

GV: Võ Tấn Dũng

TRÊN MÁY KHÁCH:


PHẦN 3

GV: Võ Tấn Dũng

XÂY DỰNG ỨNG DỤNG CORBA
TRONG MÔI TRƯỜNG JAVA



CHƯƠNG TRÌNH HELLO WORLD
• Ta thực hiện viết một chương trình Hello World đơn giản.
Chương trình CORBA trên máy client sẽ gọi đối tượng
trên máy server. Đối tượng trên máy server sẽ trả về chuỗi
mang lời chào “Hello CORBA”
Công việc phía Client:
• Xây dựng chương trình
gọi đối tượng Hello của
máy chủ.

12

GV: Võ Tấn Dũng

Công việc phía Server:
• Xây dựng đặc tả Hello.idl
• Xây dựng đối tượng
Hello bằng idlj và ngôn
ngữ Java.
• Khởi động dịch vụ đăng
ký tnameserv.exe
• Viết chương trình cài đặt
đối tượng Hello lên máy
chủ.


CÁC CÔNG VIỆC PHÍA SERVER (step 1)
• Chúng ta cần một đối tượng Hello. Đối tượng này cung
cấp phương thức sayHello(). Đặc tả đối tượng bằng ngôn

ngữ CORBA IDL được diễn đạt như sau:
interface Hello {
string sayHello();
};

13

GV: Võ Tấn Dũng

• Lưu đoạn mã trên thành tập tin Helo.idl trong thư mục tùy
ý, ở đây ta chọn lưu trong thư mục C:\CORBA\Hello


CÁC CÔNG VIỆC PHÍA SERVER (step 2)
• Với nội dung của tập tin Hello.idl, ta sử dụng chương trình
idlj.exe để chuyển đặc tả sang ngôn ngữ Java. Đánh lệnh
biên dịch như sau:
idlj -fserver Hello.idl
HelloOperations.java

tập tin chuyển đặc tả IDL thành
đặc tả interface của Java

Hello.java

tập tin chuyển lớp giao tiếp đối
tượng kiểu Java thành lớp giao
tiếp đối tượng đặc thù trong
CORBA.


HelloPOA.java

Tập tin chứa lớp cài đặt cho đối
tượng CORBA

• Muốn cài đặt đối tượng CORBA ta quan tâm đến lớp
HelloPOA. Đối tượng CORBA thật sự của lớp Hello sẽ
được cài đặt ở bước kế tiếp.
14

GV: Võ Tấn Dũng

• Kết quả ta thu được các tập tin sau:


CÁC CÔNG VIỆC PHÍA SERVER (step 3)

• Lớp HelloPOA nguyên thủy kế thừa từ lớp CORBA.Object, cho nên
lớp HelloServent được kế thừ từ HelloPOA cũng là một đối tượng
CORBA chính thống.
• Các lớp Hello.class, HelloOperations.class là những lớp trung gian hỗ
trợ cho lời gọi của trình môi giới ORB đến đối tượng CORBA.
• Lệnh dịch tất các tập tin Java nguồn nói trên như sau:
C:\CORBA\Hello>javac *.java
15

GV: Võ Tấn Dũng

/* HelloServant.java*/
public class HelloServant extends HelloPOA

{
public String sayHello()
{
System.out.println("Client contact !");
return "Hello CORBA";
}
}


CÁC CÔNG VIỆC PHÍA SERVER (step 4)
• Bước tiếp theo ta khởi động trình đăng ký đối tượng CORBA
trên server, trình này là tnameserv.exe. Mặc định dịch vụ này
chạy trên cổng 900. Ta có thể thay đổi cổng 1020 cho nó
bằng lệnh:
tnameserv -ORBInitialPort 1020

16

GV: Võ Tấn Dũng

C:\CORBA\Hello>tnameserv
Initial Naming Context:
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f
6e746578744578743a312e30000000000001000000000000009a000102000000000c3139322e3136
382e312e32000384000000000045afabcb0000000020000f42400000000100000000000000020000
0008526f6f74504f41000000000d544e616d65536572766963650000000000000008000000010000
00011400000000000002000000010000002000000000000100010000000205010001000100200001
0109000000010001010000000026000000020002
TransientNameServer: setting port for initial object references to: 900
Ready.



CÁC CÔNG VIỆC PHÍA SERVER (step 5)
/*Setup.java*/
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
public class Setup
{
public static void main(String args[]) throws Exception{
System.out.println("Setup CORBA Hello Object");
//khởi động trình môi giới đối tượng ORB
ORB orb=ORB.init(args,null);
//tạo đối tượng CORBA
HelloServant servant= new HelloServant();
//kết nối đối tượng CORBA với trình môi giới ORB
orb.connect(servant);
//lấytham chiếu đến dịch vụ đăng ký tnameserv
org.omg.CORBA.Object nameService=
orb.resolve_initial_references("NameService");
//code còn ở slide tiếp theo

17

GV: Võ Tấn Dũng

Xây dựng chương trình cài đặt và đăng ký đối tượng CORBA HelloServant tại máy chủ:


CÁC CÔNG VIỆC PHÍA SERVER (step 5)

//lấy về các thông tin ngữ cảnh hay môi trường
//mà dịch vụ tnameserv đang hoạt động
NamingContext nsContext =
NamingContextHelper.narrow(nameService);
//tạo tên của đối tượng
NameComponent nc=new NameComponent("Hello","");
//tạo đường dẫn để lưu tên đối tượng
NameComponent path[]={nc};
//ràng buộc đối tượng theo tên do dịch vụ tnameserv quản lý

}

Setup CORBA Hello Object
Waiting for client…

18

GV: Võ Tấn Dũng

}

nsContext.rebind(path,servant);
System.out.println("Waiting for client ...");
//tạo đối tượng Java
java.lang.Object obj = new java.lang.Object();
//vòng lặp vô tận chờ nhận yêu cầu từ máy khách
tnameserv đang chạy trên một cửa số DOS-prompt.
synchronized (obj){
Mở thêm một cửa sổ DOS-prompt khác:
obj.wait();

C:\CORBA\Hello>javac Setup.java
}
C:\CORBA\Hello>java Setup


CÁC CÔNG VIỆC PHÍA CLIENT(step 1)
• Tại client, trước tiên là tạo ra các lớp trung gian. Dùng
trình idlj.exe để chuyển đặc tả IDL của Hello về các lớp
đặc tả bằng Java phía Client bằng cách lưu tập tin
Hello.idl vào C:\CORBA\Hello\Client rồi thực hiện lệnh
sau:
idlj -fclient Hello.idl
• Kết quả ta thu được các tập tin sau:
HelloHolder.java
Hello.java
HelloOperations.java
_HelloStub.java

_HelloStub.java chính là lớp
trung gian thực hiện giao tiếp
giữa ORB và đối tượng
CORBA
19

GV: Võ Tấn Dũng

HelloHelper.java


CÁC CÔNG VIỆC PHÍA CLIENT (step 2)

/* Client.java*/ //Cài đặt trình khách như sau:
import org.omg.CORBA.*; import org.omg.CosNaming.*;
public class Client
{
public static void main(String args[]) throws Exception{
//khởi động trình môi giới ORB

ORB orb=ORB.init(args,null);
// tham chiếu đến dịch vụ tên tnameserv
org.omg.CORBA.Object nameService=orb.resolve_initial_references("NameService");

}
}

20

GV: Võ Tấn Dũng

//chuyển tham chiếu về đối tượng Naming Context
NamingContext nsContext = NamingContextHelper.narrow( nameService);
//tạo đường dẫn mang tên đối tượng
NameComponent nc=new NameComponent("Hello","");
NameComponent path[]={nc};
//Lấy về tham chiếu của đối tượng CORBA trên máy chủ dựa vào tên
Hello servant=HelloHelper.narrow(nsContext.resolve(path));
System.out.println( servant.sayHello() );


CÁC CÔNG VIỆC PHÍA CLIENT (step 3)
• Lưu Client.java cùng vào thư mục:


C:\CORBA\Hello\Client
• Thực hiện lệnh biên dịch sau để biên dịch tất các các tập
tin Java nguồn có trong thư mục Client:

C:\CORBA\Hello\Client>javac *.java

C:\CORBA\Hello\Client>java Client
21

GV: Võ Tấn Dũng

• Mở một cửa sổ DOS-prompt khác để chạy trình khách từ
dòng lệnh:


TÌM HIỂU CÁC ĐỐI TƯỢNG CORBA ĐÃ CÀI ĐẶT
• Các tập tin trung gian cài đặt phía máy chủ (server):
HelloOperations.java
Hello.java
HelloPOA.java

• Các tập tin trung gian cài đặt phía máy khách (client):
HelloHelper.java
HelloHolder.java
Hello.java
HelloOperations.java

22


GV: Võ Tấn Dũng

_HelloStub.java


PHẦN 4

GV: Võ Tấn Dũng

CÁC CÁCH KHỞI ĐỘNG
TRÌNH MÔI GIỚI ORB


KHỞI ĐỘNG ORB BẰNG LỜI GỌI HÀM
• Ở ví dụ Hello nói trên chúng ta đã khởi động trình môi giới
ở hai phía khách chủ bằng cách gọi lệnh:

ORB orb=ORB.init(args,null);

24

GV: Võ Tấn Dũng

• Phương thức tĩnh init() của lớp ORB cần hai đối số. Đối số
thứ nhất dùng để nhận các tùy chọn từ các dòng lệnh nếu
có. Đối số thứ hai là các tùy chọn do lập trình viên chỉ
định. Nếu cả hai đối số này đều mang giá trị null thì ORB
sẽ sử dụng các thông số hệ thống mặc định.



KHỞI ĐỘNG ORB BẰNG DÒNG LỆNH
• Trong trường hợp ta không dùng các giá trị mặc định của
ORB thì ta có thể khởi tạo các đối số cho ORB từ dòng
lệnh như sau:
Trên máy chủ:
C:\Java\jdk1.6.0_11\bin>tnameserv -ORBInitialPort 1050

25

GV: Võ Tấn Dũng

Trên máy khách:
C:\CORBA\Hello>Client>java -ORBInitialPort 1050
-ORBInitialHost 172.16.11.12


×