4. Регистрация имени удаленного объекта (HelloImpl)
String name = «Hello»;
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind (path, href);
Регистрация имени производится для того, чтобы клиент смог найти удаленный объект. Этой цели служит функция rebind (NameComponent[] nc, Object obj) интерфейса NamingContext.
5. Ожидание запросов от клиента
orb.run();
Теперь сервер готов к работе.
// HelloServer.java
import HelloApp.*;
import org.omg. CosNaming.*;
import org.omg. CosNaming. NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg. PortableServer.*;
import org.omg. PortableServer.POA;
import java.util. Properties;
class HelloImpl extends HelloPOA {
private ORB orb;
public void setORB (ORB orb_val) {
orb = orb_val;
}
// implement sayHello() method
public String sayHello() {
return «\nHello world!!\n»;
}
// implement shutdown() method
public void shutdown() {
orb.shutdown(false);
}
}
public class HelloServer {
public static void main (String args[]) {
try {
// create and initialize the ORB
ORB orb = ORB.init (args, null);
// get reference to rootpoa & activate the POAManager
POA rootpoa = POAHelper.narrow (orb.resolve_initial_references («RootPOA»));
rootpoa.the_POAManager().activate();
// create servant and register it with the ORB
HelloImpl helloImpl = new HelloImpl();
helloImpl.setORB(orb);
// get object reference from the servant
org.omg.CORBA. Object ref = rootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.narrow(ref);
// get the root naming context
// NameService invokes the name service
org.omg.CORBA. Object objRef =
orb.resolve_initial_references («NameService»);
// Use NamingContextExt which is part of the Interoperable
// Naming Service (INS) specification.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// bind the Object Reference in Naming
String name = «Hello»;
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind (path, href);
System.out.println («HelloServer ready and waiting…»);
// wait for invocations from clients
orb.run();
}
catch (Exception e) {
System.err.println («ERROR:» + e);
e.printStackTrace (System.out);
}
System.out.println («HelloServer Exiting…»);
}
}
6.1.3 Создание клиента
Перейдем к написанию кода для клиента.
Основные шаги написания клиентского приложения
1. Создание и инициализация ORB
2. Получение контекста службы имен (NamingContext)
3. Нахождение удаленного объекта
4. Вызов метода sayHello.
5. Вызов метода shutdown.
Как видно, первые два пункта совпадают с этапами создания серверного приложения, поэтому рассматривать их не будем.
Третий пункт реализуется тоже достаточно просто. Создается объект NameComponent. Вызывается метод resolve (NameComponent[] path), который отыскивает по имени удаленный объект (стандартный CORBA‑объект). При помощи метода narrow (org.omg.CORBA. Object obj) класса helloHelper (сгенерированного idlj компилятором) получаем объектную ссылку на интерфейс hello.
String name = «Hello»;
helloImpl = HelloHelper.narrow (ncRef.resolve_str(name));
Теперь можно вызывать метод 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.
... модель) и IBM SOM. Каждая определяет протоколы, используемые объектами для взаимодействия друг с другом. Основное их различие заключается в том, что SOM нейтральна к языкам программирования и поддерживает наследование, тогда как COM ориентирована на С++ и вместо механизма наследования использует альтернативный механизм, который Microsoft называет агрегацией. Семейство CORBA Hewlett-Packard, ...
... на будущее. DAO и RDO известны уже достаточно давно, и появление двух разных механизмов было связано с необходимостью оптимизации решения двух отдельных задач: доступа к локальным и удаленным базам данных соответственно. Однако естественное развитие вычислительных систем привело к необходимости создания единого механизма, который обеспечил бы единый подход при работе с БД различных классов. В ...
... СУБД; можно управлять распределением областей внешней памяти, контролировать доступ пользователей к БД и т.д. в масштабах индивидуальной системы, масштабах ограниченного предприятия или масштабах реальной корпоративной сети. В целом, набор серверных продуктов одиннадцатого выпуска компании Sybase представляет собой основательный, хорошо продуманный комплект инструментов, которые можно ...
... для таблиц dBASE и Paradox. С использованием этих компонентов создание программы просмотра и редактирования базы данных почти не требует программирования. Win 3.1. На этой странице находятся компоненты Delphi 1.0, возможности которых перекрываются аналогичными компонентами Windows 95. Internet. Эта страница предоставляет компоненты для разработки приложений, позволяющих создавать HTML ...
0 комментариев