24/05/2018, 23:34

Tham chiếu ngược (Callback) của đối tượng Corba

RMI có khả năng tham chiếu ngược (callback), đó là lời triệu gọi của trình chủ ngược về các đối tượng cài đặt trên máy khách. Đối tượng Corba cũng cho phép bạn thực hiện điều này. AtServer là đối tượng Corba cài đặt trên máy chủ. AtClient là đối ...

RMI có khả năng tham chiếu ngược (callback), đó là lời triệu gọi của trình chủ ngược về các đối tượng cài đặt trên máy khách. Đối tượng Corba cũng cho phép bạn thực hiện điều này.

AtServer là đối tượng Corba cài đặt trên máy chủ. AtClient là đối tượng Corba chạy trên máy khách. Chương trình khách triệu 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 từ máy khách.

Đặc tả đối tượng AtClient và AtServer bằng ngôn ngữ IDL được khai báo như sau:

Ví dụ 7.1:ClientServer.idl

Interface AtClient{

void callClientMethod(in string message);

};

Interface AtServer{

void registerClient(in AtClient c)

void callServerMethod(in string message);

};

Tập tin Client Server.idl đặc tả cả hai interface cho AtClient và AtServer. Bạn dùng trình biên dich idlj để dịch ClientServer.idl thành các tập tin Java phục vụ cho cả hai phía khách, chủ như sau:

idlj - fserver - oldImplBase ClientServer.idl

idlj - fclient - oldImplBase ClientServer.idl

Cài đặt AtClient và AtServer. Giao diện (interface) AtClient được cài đặt thành đối tượng Corba AtClientServant còn giao diện AtServer được cài đặt thành đối tượng Corba AtServant như sau:

Ví dụ 7.2: AtClientServant.java

public class AtClientServant extends _AtClientImplBase{

public void callClientMethod(String message){

System.out.println(message);

}

}

Ví dụ 7.3: AtServerServant.java

public class AtServerServant extends _AtServerImplBase

{

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()*1000;

//Trieu goi phuong thuc cua doi tuong chay tren may khach

client.callClientMethod(msg);

}

}

}

Xây dựng trình chủ dùng cài đặt và đăng ký đối tượng AtServer trên máy chủ

Ví dụ 7.4: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 Client");

//Tao doi tuong AtClient

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

AtServerServant servant= new AtServerServant();

//ket noi AtClient voi trình môi gioi

Orb.connect(servant);

org.omg.Corba.Object nameService=Orb.resolve_initial_references("NameService");

NamingContext nsContext=NamingContextHelper.narrow(nameService);

NameComponent nc= new NameComponent("AtServerObject","");

NameComponent path[]={nc};

nsContext.rebind(path,servant);

//Tao doi tuong Java

java.lang.Object obj=new java.lang.Object();

//VOng lap vo tận chờ nhân yêu cầu của máy khách

synchronized (obj){

obj.wait();

}

}

}

Cài đặt trình khách,triệu gọi đối tượng AtServer trên máy chủ

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");

//Tao doi tuong AtClient

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

AtClientServant clientservant= new AtClientServant();

//ket noi AtClient voi trình môi gioi

Orb.connect(clientservant);

/*Yêu cau dich vu COS Naming truy tìm tham chieu cua AtServer thông qua tên gu1ECDi” AtServerObject”*/

org.omg.Corba.Object nameService=Orb.resolve_initial_references("NameService");

NamingContext nsContext=NamingContextHelper.narrow(nameService);

NameComponent nc=new NameComponent("AtServerObject","");

NameComponent path[]={nc};

AtServer Serverservant=AtServerHelper.narrow(nsContext.resolve(path));

Serverservant.registerClient(clientservant);

//Trieu goi doi tuong chu

Serverservant.callServerMethod("Client request");

}

}

Biên dịch và chạy chương trình

Với chương trình bên server

javac *.java

start tnameserv

java Setup

Với chương trình bên Client

javac *.java

start tnameserv

java Client

0