Теперь можно вызывать метод 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);
}
}
}
Файлы 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
Язык 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.