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
CÁC KHÁI NIỆM
g n ũ D n ấ T õ V
:
V G
KHÁI NIỆM CORBA
• 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 tổ chức nghiên cứu quốc tế OMG hình thành từ một (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)
3
g n ũ D n ấ T õ V
:
V G
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.
• 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)
• 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
g n ũ D n ấ T õ V
:
V G
IDL TRONG CORBA
• 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
g n ũ D n ấ T õ V
:
V G
IDL ÁNH XẠ SANG JAVA
Bảng ánh xạ giữa IDL và Java:
IDL CORBA JAVA
- Để 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:
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
6
g n ũ D n ấ T õ V
:
V G
idlj YourObject.idl
PHẦN 2 CORBA VÀ MÔ HÌNH PHÂN TÁN
g n ũ D n ấ T õ V
:
V G
ORB(Object Request Broker) chương trình môi giới trung gian
• 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.
I
Internet / Mạng
L D
D L
I
O R B
B R O
8
g n ũ D n ấ T õ V
:
V G
Java CORBA Object C++ CORBA Object
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 Object X
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
9
g n ũ D n ấ T õ V
:
Lời gọi đối tượng thực tế
V G
ORB ORB
QUY TRÌNH XÂY DỰNG ỨNG DỤNG CORBA
• Đặ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.
TRÊN MÁY CHỦ:
• 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
g n ũ D n ấ T õ V
:
V G
TRÊN MÁY KHÁCH:
PHẦN 3 XÂY DỰNG ỨNG DỤNG CORBA TRONG MÔI TRƯỜNG JAVA
g n ũ D n ấ T õ V
:
V G
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 Server: • Xây dựng đặc tả Hello.idl • Xây dựng đối tượng
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ủ.
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ủ.
12
g n ũ D n ấ T õ V
:
V G
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();
};
• 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
13
g n ũ D n ấ T õ V
:
V G
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
• Kết quả ta thu được các tập tin sau:
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
14
g n ũ D n ấ T õ V
:
V G
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.
CÁC CÔNG VIỆC PHÍA SERVER (step 3)
/* HelloServant.java*/ public class HelloServant extends HelloPOA {
public String sayHello() {
System.out.println("Client contact !"); return "Hello CORBA";
• 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
g n ũ D n ấ T õ V
:
V G
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
C:\CORBA\Hello>tnameserv Initial Naming Context: IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f 6e746578744578743a312e30000000000001000000000000009a000102000000000c3139322e3136 382e312e32000384000000000045afabcb0000000020000f42400000000100000000000000020000 0008526f6f74504f41000000000d544e616d65536572766963650000000000000008000000010000 00011400000000000002000000010000002000000000000100010000000205010001000100200001 0109000000010001010000000026000000020002 TransientNameServer: setting port for initial object references to: 900 Ready.
16
g n ũ D n ấ T õ V
:
V G
CÁC CÔNG VIỆC PHÍA SERVER (step 5)
Xây dựng chương trình cài đặt và đăng ký đối tượng CORBA HelloServant tại máy chủ:
/*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=
17
orb.resolve_initial_references("NameService");
g n ũ D n ấ T õ V
:
V G
//code còn ở slide tiếp theo
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ý 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 synchronized (obj){
obj.wait();
}
}
tnameserv đang chạy trên một cửa số DOS-prompt. Mở thêm một cửa sổ DOS-prompt khác: C:\CORBA\Hello>javac Setup.java C:\CORBA\Hello>java Setup Setup CORBA Hello Object Waiting for client…
18
g n ũ D n ấ T õ V
:
V G
}
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 thực hiện lệnh Hello.idl vào C:\CORBA\Hello\Client rồi sau:
idlj -fclient Hello.idl
• Kết quả ta thu được các tập tin sau:
HelloHelper.java
HelloHolder.java
Hello.java
HelloOperations.java
_HelloStub.java chính là lớp trung gian thực hiện giao tiếp tượng giữa ORB và đối CORBA
19
g n ũ D n ấ T õ V
:
V G
_HelloStub.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"); //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() );
}
20
g n ũ D n ấ T õ V
:
V G
}
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
• Mở một cửa sổ DOS-prompt khác để chạy trình khách từ
dòng lệnh:
C:\CORBA\Hello\Client>java Client
21
g n ũ D n ấ T õ V
:
V G
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
• Các tập tin trung gian cài đặt phía máy khách (client):
HelloPOA.java
HelloHelper.java
HelloHolder.java
Hello.java
HelloOperations.java
22
g n ũ D n ấ T õ V
:
V G
_HelloStub.java
PHẦN 4 CÁC CÁCH KHỞI ĐỘNG TRÌNH MÔI GIỚI ORB
g n ũ D n ấ T õ V
:
V G
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);
• 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.
24
g n ũ D n ấ T õ V
:
V G
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
Trên máy khách:
C:\CORBA\Hello>Client>java -ORBInitialPort 1050
-ORBInitialHost 172.16.11.12
25
g n ũ D n ấ T õ V
:
V G
KHỞI ĐỘNG ORB TRONG MÃ LỆNH
• Ta có thể chỉ định các tùy chọn để ORB khởi động ngay trong mã lệnh
như sau:
/*Setup.java*/ import org.omg.CORBA.*; import org.util.Properties; public class Client {
public static void main(String args[]) {
Properties props = new Properties(); props.put(“org.omg.CORBA.ORBInitialPort”,”1050”); props.put(“org.omg.CORBA.ORBInitialHost”,
”172.16.11.12”);
ORB orb = ORB.init(args,props); …
}
}
26
• Trong trường hợp ta chỉ định cả hai tùy chọn là vừa từ tham số dòng lệnh và
g n ũ D n ấ T õ V
:
V G
vừa từ mã lệnh thì ORB sẽ ưu tiên lấy các tùy chọn do mã lệnh thiết lập
PHẦN 6 TÌM HIỂU JDNI VÀ DỊCH VỤ COS NAMING TRONG CORBA
g n ũ D n ấ T õ V
:
V G
JNDI & DỊCH VỤ NAMING TRONG RMI
• Khi muốn sử dụng một đối tượng nào đó, ta phải biết tên
của đối tượng và nơi mà đối tượng đó được cất giữ.
• Mỗi dịch vụ quản lý tênđều quy định cách thức để lưu trữ và gắn tên cho các đối tượng. Dịch vụ quản lý tên cũng cung cấp cách thức tìm kiếm và đặt tên cho đối tượng một cách nhất định.
• Java đặc tả một tập hợp các hàm API dùng để phục vụ cho việc quản lý, lưu tên và tìm kiếm các đối tượng. Các là JNDI (Java Naming hàm API loại này được gọi Directory Interface).
• JNDI chỉ đưa ra đặc tả ở dạng interface. Các dịch vụ nào muốn sử dụng JNDI thì phải cài đặt giao tiếp do Java qui định.
28
g n ũ D n ấ T õ V
:
V G
JNDI & DỊCH VỤ NAMING TRONG RMI(tt)
• Dịch vụ Naming chỉ hỗ trợ cho các đối tượng RMI trong Java. Naming có cách truy xuất đối tượng theo địa chỉ dạng URL dựa vào tên đối tượng khi đăng ký.
• Ví dụ, tên myhello được ràng buộc với đối tượng Hello
như sau:
Naming.bind(“rmi://localhost/myhello”, Hello); • Cho nên để lấy tham chiếu của một đối tượng RMI thì ta
gọi hàm như sau:
Object o=Naming.lookup(“rmi://localhost/myhello”); • Quá rình dựa vào tên của đối tượng để tìm lại được tham chiếu của đối tượng đã được dịch vụ Naming lưu trước đó thì được gọi là phân giải đối tượng (object resolving).
29
g n ũ D n ấ T õ V
:
V G
JNDI & DỊCH VỤ COS NAMING CỦA CORBA
• Cũng dựa vào đặc tả JNDI của Java nhưng CORBA xây dựng một cơ chế lưu trữ và tham chiếu của đối tượng khác với dịch vụ Naming của RMI. CORBA phân ra khái niệm Naming Context và Naming Component.
• Namning Context (đóng vai trò như một thư mục) là một đối tượng có khả năng dẫn tham chiếu đến một Naming Component hay một Naming Context khác.
• Naming Component (tương tự như một file): là một thành phần chứa tên, có khả năng ràng buộc tên với một đối tượng bất kỳ nào đó (và đối tượng này phải là đối tượng CORBA).
• Naming Component và Naming Context quan hệ với nhau theo cấu trúc hình cây tương tự như cấu trúc cây thư mục của hệ thống file. Trình tnameserv.exe chính là dịch vụ lưu trữ theo cách này trong CORBA.
30
g n ũ D n ấ T õ V
:
V G
JNDI & DỊCH VỤ COS NAMING CỦA CORBA(tt1)
Market Market
Name Component
Object A
Stock Stock
Name Context
Toys Toys
Object B
Fruit Fruit
Shelf Shelf
Object C
Book Book
Panel Panel
Tên ràng buộc của đối tượng
Name Component
31
g n ũ D n ấ T õ V
:
Đối tượng được ràng buộc
Name Context
V G
JNDI & DỊCH VỤ COS NAMING CỦA CORBA(tt2)
• Ta thấy Market là một Naming Context. Nó cho phép tìm 3 thành phần khác là Stock, Shelf và Panel. Trong đó Stock và Shelf là hai Naming Context. Stock chứa 2 thành phần là Toys và Fruit. Shelf chứa một thành phần mang tên là Book. Đối tượng Object A được ràng buộc với Toys. Đối tượng Object B với Fruit. Đối tượng Object C bởi cả hai Book và Panel.
• Nếu đứng từ Market tham chiếu đến Object A thì phải chỉ
ra đường dẫn là: Market\Stock\Toys.
• Nếu đứng từ Market tham chiếu đến Object C thì:
Market\Panel hoặc Market\Shelf\Book.
• Nếu đứng từ Stock tham chiếu đến Object B thì:
Stock\Fruit.
32
g n ũ D n ấ T õ V
:
V G
JNDI & DỊCH VỤ COS NAMING CỦA CORBA(tt3)
• Tiến hành cài đặt một chương trình sau đây để lưu trữ các
đối tượng theo cấu trúc hình cây ở slide trên:
(xem trong nội dung các file kèm theo sau đây)
Generic.idl
GenericServant.java
NamingRegister.java
NamingBrowse.java
33
g n ũ D n ấ T õ V
:
V G
PHẦN 7 LƯU ĐỊA CHỈ THAM CHIẾU CỦA ĐỐI TƯỢNG CORBA Ở DẠNG CHUỖI
g n ũ D n ấ T õ V
:
V G
KỸ THUẬT STRING FIELD (IOR)
• Nếu thấy dịch vụ COS Naming của CORBA quá phức tạp thì vẫn còn cách truy xuất khác dễ dàng mà không cần đến COS Naming.
• CORBA cho phép chuyển đổi tham chiếu của một đối tượng trên máy chủ thành một chuỗi (String). Ta lưu chuỗi này thành tập tin và chuyển đến trình máy khách. Trình máy khách đọc nội dung của chuỗi sau đó khôi phục chuỗi trở lại thành tham chiếu của đối tượng. Kỹ thuật này trong là String field (còn có tên khác là IOR- CORBA gọi Interoperable Object References)
Ví dụ: • Sử dụng lại đối tượng Generic ở trên, cài đặt lại 2 tập tin
Setup.java và Client.java (sách trang 220 và 221)
35
g n ũ D n ấ T õ V
:
V G
PHẦN 8 THAM CHIẾU NGƯỢC TRONG CORBA (CALLBACK)
g n ũ D n ấ T õ V
:
V G
THAM CHIẾU NGƯỢC (CALL BACK)
• Tham chiếu ngược là lời gọi từ trình chủ ngược về các đối tượng đặt trên máy khách. Đối tượng CORBA cũng cho phép ta thực hiện kỹ thuật này.
• Sau đây ta sẽ viết lại cácđố i tượng RMI AtServer và trong bài số 3 (nói về RMI) theo cách của
AtClient CORBA.
• AtServer là đối là đối
trên máy chủ. tượng CORBA cài đặt AtClient tượng CORBA chạy trên máy khách. Chương trình khách gọi AtServer trên máy chủ và gửi tham chiếu của AtClient đến trình chủ. AtServer sử dụng tham chiếu của AtClient để gọi ngược về trình khách.
37
g n ũ D n ấ T õ V
:
V G
BÀI VÍ DỤ VỀ CALLBACK (STEP 1)
• Bước 1: Đặc tả đối tượng AtClient và AtServer bằng ngôn
ngữ IDL trong file ClientServer.idl
interface AtClient{
void callClientMethod(in string message);
};
interface AtServer{
void registerClient(in AtClient c); void callServerMethod(in string message);
}
• biên dịch ClientServer.idl: idlj idlj
-fserver ClientServer.idl -fclient ClientServer.idl
38
g n ũ D n ấ T õ V
:
V G
BÀI VÍ DỤ VỀ CALLBACK (STEP 2) • Bước 2: Cài đặt 2 giao tiếp AtClient và AtServer thành 2 đối tượng CORBA là
AtClientServant và AtServerServant
/*AtClientServant.java*/ public class AtClientServant extends _AtClientImplBase {
public void callClientMethod (String message){
System.out.println(message);
}
} /*AtServerServant.java*/ public class AtServerServant extends _AtClientImplBase {
AtClient client; public void registerClient(AtClient c){ client=c; } public void callServerMethod(String message){
System.out.println(message); for(int i=1;i<10;i++){
String msg=“Server response “ + Math.random()*100; client.callClientMethod(msg);
}
}
39
g n ũ D n ấ T õ V
:
}
V G
BÀI VÍ DỤ VỀ CALLBACK (STEP 3) • Bước 3: Xây dựng trình chủ để cài đặt và đăng ký đối
tượng AtServer trên máy chủ.
/*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(“CORBA Callback demo”); //khởi động trình môi giới ORB orb=ORB.init(args,null); //Tạo đối tượng AtServer AtServer servant=new AtServerServant(); //Kết nối đối tượng AtServer với trình môi giới orb.connect(servant); //đăng ký tên đối tượng với dịch vụ COS Naming org.omg.CORBA.Object nameService =
40
orb.resolve_initial_references(“NameService”);
//còn tiếp ở slide kế tiếp
g n ũ D n ấ T õ V
:
V G
BÀI VÍ DỤ VỀ CALLBACK (STEP 3 tt)
• Bước 3: (tiếp theo)
//tiếp theo slide trước
NamingContext nsContext =
NamingContextHelper.narrow(nameService);
NameComponent nc=new
NameComponent(“AtServerObject”,””);
NameComponent path[]={nc}; nsContext.rebind(path,servant); //chờ yêu cầu đến từ máy khách java.lang.Object obj=new java.lang.Object(); synchronized(obj){ obj.wait();
}
}
41
g n ũ D n ấ T õ V
:
V G
}
BÀI VÍ DỤ VỀ CALLBACK (STEP 4) • Bước 4: Cài đặt trình khách, gọi đối tượng AtServer trên
máy chủ.
/*Client.java*/ import org.omg.CORBA.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; public class Client {
public static void main(String args[]) throws Exception{
System.out.println(“CORBA Client”); //khởi động trình môi giới ORB orb=ORB.init(args,null); //Tạo đối tượng AtClient AtClientServant clientservant=new AtClientServant(); //Kết nối đối tượng AtClientServant với trình môi giới orb.connect(clientservant); //nhờ COS Naming tìm tham chiếu AtServer qua tên gọi AtServerObject org.omg.CORBA.Object nameService =
42
orb.resolve_initial_references(“NameService”);
//còn tiếp ở slide kế tiếp
g n ũ D n ấ T õ V
:
V G
BÀI VÍ DỤ VỀ CALLBACK (STEP 4 tt)
• Bước 4: (tiếp theo)
//tiếp theo slide trước
NamingContext nsContext =
NamingContextHelper.narrow(nameService);
NameComponent nc=new
NameComponent(“AtServerObject”,””);
NameComponent path[]={nc}; AtServer serverservant=
AtServerHelper.narrow(nsContext.resolve(path)); //Bắt đầu quá trình tương tác với đối tượng AtServer trên máy chủ //Đăng ký (gửi tham chiếu) của đối tượng AtClient với đ.tượng chủ serverservant.callServerMethod(“Client request”);
}
43
g n ũ D n ấ T õ V
:
V G
}
BÀI VÍ DỤ VỀ CALLBACK (STEP 5) • Bước 5: Biên dịch và chạy chương trình. Ta tạo thư mục C:\CORBA\callback. Lưu tất cả mã nguồn vào thư mục này. Chuyển vào thư mục biên dịch và chạy chương trình như sau:
Biên dịch:
C:\CORBA\callback>javac *.java
Khởi động dịch vụ tnameserv.exe trên một cửa sổ DOS- promp khác:
C:\CORBA>callback>tnameserv.exe
Chạy trình chủ trên một cửa sổ DOS-prompt khác: C:\CORBA\callback>java Setup
44
g n ũ D n ấ T õ V
:
V G
Chạy trình chủ trên một cửa sổ DOS-prompt khác: C:\CORBA\callback>java Client
PHẦN 9 CÁC VẤN ĐỀ KHÁC
g n ũ D n ấ T õ V
:
V G
Các vấn đề khác
•Một số vấn đề như: – Dynamic Method Call – RMI-over-IIOP – Visibroker của hãng Borland Xem trong Chương Ba, sách “Java tập 2”, tác giả
Phương Lan, NXB Thống Kê, năm 2004.
46
g n ũ D n ấ T õ V
:
V G
Hết BÀI 4
g n ũ D n ấ T õ V
:
V G