Смекни!
smekni.com

Реализация почтового клиента и сервера на основе CORBA (стр. 2 из 2)

Теперь можно вызывать метод sayHello:

System.out.println (helloImpl.sayHello());

Метод shutdown завершает работы сервера.

helloImpl.shutdown();

//testClient.java

import HelloApp.*;

import org.omg. CosNaming.*;

import org.omg. CosNaming. NamingContextPackage.*;

import org.omg.CORBA.*;

public class HelloClient

{

static Hello helloImpl;

public static void main (String args[])

{

try {

// create and initialize the ORB

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

// get the root naming context

org.omg.CORBA. Object objRef =

orb.resolve_initial_references («NameService»);

// Use NamingContextExt instead of NamingContext. This is

// part of the Interoperable naming Service.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

// resolve the Object Reference in Naming

String name = «Hello»;

helloImpl = HelloHelper.narrow (ncRef.resolve_str(name));

System.out.println («Obtained a handle on server object:» + helloImpl);

System.out.println (helloImpl.sayHello());

helloImpl.shutdown();

} catch (Exception e) {

System.out.println («ERROR:» + e);

e.printStackTrace (System.out);

}

}

}

6.1.4 Компиляция и запуск приложения

Файлы HelloServer.java and HelloClient.java, Hello.idl и папка HelloApp, созданная idkj.exe должны храниться в одной папке.

Для компиляции клиента и сервера надо в командной строке набрать

javac *.java HelloApp/*.java

javac.exe находится в …\jdk1.5.0\bin.

Среда Eclipse не позволяет запускать CORBA‑приложения. Для запуска

1. Запустить службу orbd – Object Request Broker Daemon (…\jdk1.5.0\bin\orbd.exe). Это делается, чтобы мы смогли получить ссылку на службу имен.

start orbd – ORBInitialPort 1050

Параметр – ORBInitialPort – номер порта, на котором будет работать сервер имен.

2. Запуск сервера

start java HelloServer – ORBInitialPort 1050 – ORBInitialHost localhost

Указывается порт, на котором работает сервер имен. Параметр – ORBInitialHost указывает хост, на котором работает сервер имен.

3. Запуск клиента

java HelloClient – ORBInitialPort 1050 – ORBInitialHost localhost

Указывается порт, на котором работает сервер имен. Параметр – ORBInitialHost указывает хост, на котором работает сервер имен.

Для удобства компиляции и запуска можно создать bat‑файл:

idlj – fall Hello.idl

javac *.java HelloApp/*.java

start java HelloServer – ORBInitialPort 1050 – ORBInitialHost localhost

java HelloClient – ORBInitialPort 1050 – ORBInitialHost localhost

6.2 Язык IDL

Язык OMG IDL (Interface Definition Language – Язык Описания Интерфейсов) представляет собой технологически независимый синтаксис для описания интерфейсов объектов. При описании программных архитектур, OMG IDL прекрасно используется в качестве универсальной нотации для определения границ объекта, определяющих его поведение по отношению к другим компонентам информационной системы. OMG IDL позволяет описывать интерфейсы, имеющие различные методы и атрибуты. Язык также поддерживает наследование интерфейсов, что необходимо для повторного использования объектов с возможностью их расширения или конкретизации.

IDL является чисто декларативным языком, то есть он не содержит никакой реализации. IDL‑спецификации могут быть откомпилированы (отображены) в заголовочные файлы и специальные прототипы серверов, которые могут использоваться непосредственно программистом. То есть IDL‑определенные методы могут быть написаны, а затем выполнены, на любом языке, для которого существует отображение из IDL. К таким языкам относятся C, C++, SmallTalk, Pascal, Java, Ada.

С помощью IDL можно описать и атрибуты компоненты, и родительские классы которые, она наследует, и вызываемые исключения, и, наконец, методы, определяющие интерфейс, причем с описанием входных и выходных параметров.

Структура CORBA IDL файла выглядит следующим образом:

module <identifier> {<type declarations>;<constant declarations>;<exception declarations>;interface <identifier> [:<inheritance>] {<type declarations>;<constant declarations>;<attribute declarations>;<exception declarations>;[<op_type>]<identifier>(<parameters>)[raises exception] [context]..[<op_type>]<identifier>(<parameters>)[raises exception] [context]..}interface <identifier> [:<inheritance>]..}

Синтаксис языка IDL довольно объемный и не представляется возможным описать его в методическом пособии.

Для реализации интерфейса почтового сервера можно дополнить Hello.idl

module HelloApp

{

struct TMessage

{

string To;

string From;

string Message;

};

typedef sequence<TMessage> TMessages;

interface Hello

{

TMessages GetMessages (in string Name, out short count);

oneway void Send (in string Client, in string Name, in string Message);

string sayHello();

oneway void shutdown();

};

};

typedef sequence<TMessage> TMessages; – объявление типа динамический массив сообщений TMessage.