Данным постом, я начинаю серию статей о замечательной технологии Ice (Internet Communications Engine), которую мне довелось использовать при написании научной исследовательской работы в университете. В этой статье я планирую сделать краткий обзор технологии Ice, и показать небольшой практический пример. Сразу хотелось бы отметить, что вся прелесть Ice заключается именно в простоте его использования на практике.
Ice (The Internet Communications Engine) — объектно-ориентированная платформа среднего слоя (middleware platform), разработанная компанией ZeroC. Ice снабжена инструментами, API и библиотеками для разработки объектно-ориентированных клиент–серверных приложений. Ice приложения могут быть написаны на различных языках программирования (Java, C++, Python, C#, Ruby), запущены под различными операционными системами (Windows NT, Linux, Mac OS) и аппаратными платформами, а также могут общаться используя разнообразные сетевые технологии. В общем случае Ice позиционируется как инструмент RPC (Remote Procedure Call), который достаточно прозрачно применять на практике. Большое количество компаний по всему миру, таких как Skype, HP, Silicon Graphics используют технологию Ice в своих проектах.
Каждый Ice-объект, имеет интерфейс с конечным набором операций. Интерфейсы, операции и типы данных, которыми обмениваются сервер и клиент должны быть описаны на языке Slice. Slice позволяет описывать поведение сервера и клиента, не опираясь на какой-либо язык программирвания, благодаря этому, написанный код на slice компилируется в код любого из поддерживаемых платформой языков программирования.
Ice поддерживает следующие языки в режиме клиент-сервер: C++, Java, C#, Python, Objective-C, а также Ruby и PHP в клиентском режиме.
Для генерации кода в комплекте Ice идет компилятор slice2xxx, где xxx = java | cpp | py…
Напишем примитивное клиент-серверное приложение, в котором сервер по запросу клиента печатает на стандартный вывод сообщение «Hello World!». В качестве языка реализации выберем Java, хотя с таким же успехом можно было использовать любой другой. Важно понимать что Ice разрешает нам писать серверную часть скажем на Java, а клиентскую на Python, причем для нас это будет совершенно прозрачно. Ice инкапсулирует весь процесс маршализации/демаршализации и вызова RPC от программиста.
Ну чтож приступим. Напишем slice-модуль Hello.ice, описывающий поведение сервера:
Обзор
Ice (The Internet Communications Engine) — объектно-ориентированная платформа среднего слоя (middleware platform), разработанная компанией ZeroC. Ice снабжена инструментами, API и библиотеками для разработки объектно-ориентированных клиент–серверных приложений. Ice приложения могут быть написаны на различных языках программирования (Java, C++, Python, C#, Ruby), запущены под различными операционными системами (Windows NT, Linux, Mac OS) и аппаратными платформами, а также могут общаться используя разнообразные сетевые технологии. В общем случае Ice позиционируется как инструмент RPC (Remote Procedure Call), который достаточно прозрачно применять на практике. Большое количество компаний по всему миру, таких как Skype, HP, Silicon Graphics используют технологию Ice в своих проектах.
Slice — Specifications Language for Ice
Каждый Ice-объект, имеет интерфейс с конечным набором операций. Интерфейсы, операции и типы данных, которыми обмениваются сервер и клиент должны быть описаны на языке Slice. Slice позволяет описывать поведение сервера и клиента, не опираясь на какой-либо язык программирвания, благодаря этому, написанный код на slice компилируется в код любого из поддерживаемых платформой языков программирования.
Список поддерживаемых языков
Ice поддерживает следующие языки в режиме клиент-сервер: C++, Java, C#, Python, Objective-C, а также Ruby и PHP в клиентском режиме.
Для генерации кода в комплекте Ice идет компилятор slice2xxx, где xxx = java | cpp | py…
Практика
Напишем примитивное клиент-серверное приложение, в котором сервер по запросу клиента печатает на стандартный вывод сообщение «Hello World!». В качестве языка реализации выберем Java, хотя с таким же успехом можно было использовать любой другой. Важно понимать что Ice разрешает нам писать серверную часть скажем на Java, а клиентскую на Python, причем для нас это будет совершенно прозрачно. Ice инкапсулирует весь процесс маршализации/демаршализации и вызова RPC от программиста.
Ну чтож приступим. Напишем slice-модуль Hello.ice, описывающий поведение сервера:
- module Demo
- {
- interface Hello
- {
- void sayHello();
- };
- };
* This source code was highlighted with Source Code Highlighter.
Данный модуль говорит о том, что сервер представляет собой интерфейс с одним единственным методом seyHello(), причем метод без параметров и без возвращаемого результата (хотя можно и такое, но это уже выходит за рамки данной статьи).
Теперь сгенерируем соответствующий java-код по этому слайсу, который будет выполнять за нас всю рутину. Для этого выполним в консоли — sice2java Hello.ice.
Сгенерированный код помещаем в каталог с проектом, и пишем код сервера:
- import Demo.*;
-
- public class Server extends Ice.Application
- {
- public int
- run(String[] args)
- {
- Ice.ObjectAdapter adapter = communicator().createObjectAdapterWithEndpors("Hello", "tcp -p 10000");
- adapter.add(new HelloI(), communicator().stringToIdentity("hello"));
- adapter.activate();
- communicator().waitForShutdown();
- return 0;
- }
-
- public static void
- main(String[] args)
- {
- Server app = new Server();
- int status = app.main("Server", args);
- System.exit(status);
- }
- }
* This source code was highlighted with Source Code Highlighter.
C помощью данного кода создается адаптер, на который вешается ice-объект описанный в Hello.ice. Строка communicator().waitForShutdown() — обеспечивает зависание серверного потока, с целью обслуживания запросов.
Теперь переопределим интерфейс описанный в Hello.ice. Для этого пишем следующий код:
- import Demo.*;
-
- public class HelloI extends _HelloDisp
- {
- public void
- sayHello(Ice.Current current)
- {
- System.out.println("Hello World!");
- }
- }
* This source code was highlighted with Source Code Highlighter.
На этом реализация серверной части заканчивается. Приступим к клиенту. Для него также необходимы файлы сгенерированные slice2java из Hello.ice. Пишем код клиента:
- public class Client extends Ice.Application
- {
- public int run(String args[]) {
- HelloPrx hello = HelloPrxHelper.uncheckedCast(communicator.stringToProxy("hello:tcp -h 127.0.0.1 -p 10000"));
- hello.sayHello();
- }
-
- public static void main(String args[]) {
- Client client = new Client();
- int status = client.main("Client", args);
- System.exit(status);
- }
-
- }
* This source code was highlighted with Source Code Highlighter.
Здесь мы создаем прокси до ice-объекта в удаленном адресном пространстве, однако работаем с этим прокси как с реальным объектом.
запускаем сервер java Server;
запускаем клиент java Client и любуемся результатом.
Следует отметить что заменив в коде создания прокси адрес хоста с 127.0.0.1 на реальный, мы получаем клиент-серверное приложение.
PS. В следующих статьях я подробнее остановлюсь на архитектуре платформы Ice, процессах маршализации/демаршализации, типах вызовов процедур (синхронные, асинхронные), типах диспетчеризации вызовов, а также рассмотрю более подробно язык slice (Пользовательские данные, исключения, языкозависымые конструкции). Если конечно Вам интересно хабраюзеры)