20.1. Обзор: библиотека drb
20.1. Обзор: библиотека drb
Библиотека drb состоит из двух основных частей: серверной и клиентской. Грубую границу между ними можно провести следующим образом:
Сервер:
• запускает TCPServer и начинает прослушивать порт;
• привязывает объект к экземпляру сервера drb;
• принимает запросы на соединение от клиентов и отвечает на их сообщения;
• дополнительно может предоставлять контроль доступа (безопасность).
Клиент:
• устанавливает соединение с сервером;
• привязывает локальный объект к удаленному экземпляру сервера;
• посылает сообщения серверу и получает ответы.
Метод класса start_service отвечает за запуск TCP-сервера, прослушивающего указанный порт. Он принимает два параметра: URI (универсальный идентификатор ресурса), задающий порт (если он равен nil, то порт выбирается динамически), и объект, к которому мы хотим привязаться. Этот объект будет доступен удаленному клиенту, который сможет вызывать его методы, как если бы объект был локальным.
require "drb"
myobj = MyServer.new
DRb.start_service("druby://:1234", myobj) # Порт 1234.
# ...
Если порт выбирается динамически, то для получения полного URI, включающего и номер порта, можно воспользоваться методом класса uri.
DRb.start_service(nil, myobj)
myURI = DRb.uri # "druby://hal9000:2001"
Поскольку drb —многопоточная программа, любое серверное приложение должно выполнять join в потоке сервера (чтобы не дать приложению завершиться преждевременно и тем самым уничтожить выполняющийся поток).
# Предотвратить преждевременный выход.
DRb.thread.join
На стороне клиента мы вызываем метод start_service без параметров и с помощью класса DRbObject создаем локальный объект, соответствующий удаленному. Обычно первым параметром методу DRbObject.new передается nil.
require "drb"
DRb.start_service
obj = DRbObject.new(nil, "druby://hal9000:2001")
# Сообщения, передаваемые obj, перенаправляются
# удаленному объекту на стороне сервера...
Следует подчеркнуть, что на стороне сервера привязка осуществляется к единственному объекту, который должен отвечать на все получаемые запросы. Если клиентов несколько, то объект должен быть безопасным относительно потоков, чтобы не оказаться в некорректном состоянии. (Для совсем простых или узкоспециализированных приложений это может быть и необязательно.)
Мы не можем вдаваться в технические детали. Но имейте в виду, что если клиент читает или изменяет внутреннее состояние удаленного объекта, то при наличии нескольких клиентов возможна интерференция. Во избежание таких неприятностей мы рекомендуем применять механизмы синхронизации, например класс Mutex. (Подробнее о потоках и синхронизации рассказывается в главе 13.)
Скажем хотя бы несколько слов о безопасности. Ведь не всегда желательно, чтобы с вашим сервером мог соединяться кто угодно. Помешать им пытаться вы не можете, зато можете сделать такие попытки безуспешными.
В программе drb есть понятие списка контроля доступа (ACL). Это не что иное, как списки клиентов (или категорий клиентов), которым явно разрешен (или запрещен) доступ.
Приведем пример. Для создания нового списка ACL мы воспользуемся классом ACL, которому передадим один или два параметра.
Второй (необязательный) параметр метода ACL.new служит для ответа на вопрос: «Мы запрещаем доступ всем клиентам, кроме некоторых, или, наоборот, разрешаем доступ всем клиентам, кроме некоторых?» По умолчанию принимается первый вариант, который обозначается константой DENY_ALLOW равной 0. Второй режим обозначается ALLOW_DENY равной 1.
Первый параметр ACL.new представляет собой обычный массив строк, которые идут парами. Первая строка в паре должна быть равна "deny" или "allow", вторая описывает одного клиента или группу клиентов (по имени или по адресу):
require "drb/acl"
acl = ACL.new( %w[ deny all
allow 192.168.0.*
allow 210.251.121.214
allow localhost] )
Первая пара в этом примере, строго говоря, излишня, но проясняет смысл всей конструкции.
А как используются ACL? Метод install_acl приводит ACL в действие. Его необходимо вызывать перед обращением к start_service, иначе он не возымеет эффекта.
# Продолжение примера...
DRb.install_acl(acl)
DRb.start_service(nil, some_object)
# ...
Теперь, после запуска сервиса любой неавторизованный запрос на соединение приведет к исключению RuntimeError.
Это, конечно, не все, что можно сказать о библиотеке drb. Но для обзора вполне достаточно. В следующем разделе мы рассмотрим простой drb-сервер и drb-клиент, близкие к реальным программам. А затем поговорим о программах Rinda и Ring.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
API, POSIX и библиотека С
API, POSIX и библиотека С Обычно прикладные программы не разрабатываются с непосредственным использованием системных вызовов, при этом используются программные интерфейсы приложений (Application Programing Interface, API). Это является важным, так как в таком случае нет необходимости в
Глава 6 Библиотека GNU C
Глава 6 Библиотека GNU C Библиотека GNU С (glibc) — это стандартная библиотека языка С, разработанная для Linux-систем. Существуют и другие библиотеки С, которые иногда используются в определенных целях (например, очень маленькое подмножество стандартных библиотек С применяется
Библиотека Ext Core
Библиотека Ext Core В этом разделе мы будем изучать самые полезные для нас на данный момент возможности библиотеки Ext Core. Полностью она описана в справочнике, доступном на ее "домашнем"
Мобильная библиотека
Мобильная библиотека Книги на компьютерах и ноубтуках Итак, электронная книга может обитать, как минимум, на трех различных «квартирах»: обычный компьютер (десктоп или ноутбук), карманный компьютер или коммуникатор, и, наконец, мобильник или смартфон. Само собой
23.2. Библиотека Glib
23.2. Библиотека Glib 23.2.1. Стандартные типы данных библиотеки Glib Библиотека Glib содержит типы данных, аналогичные типам данных языка С, а также такие структуры, как деревья, списки; функции для работы с памятью и обработки ошибок. Это сделано для того, чтобы ваше приложение
5.12. Библиотека mathn
5.12. Библиотека mathn В программах, выполняющих большой объем математических вычислений, очень пригодится замечательная библиотека mathn, которую написал Кейдзу Исидзука (Keiju Ishitsuka). В ней есть целый ряд удобных методов и классов; кроме того, она унифицирует все классы Ruby для
14.3. Библиотека Shell
14.3. Библиотека Shell Не всегда Ruby удобен в качестве языка сценариев. Например, в языке bash для запуска внешней программы достаточно просто указать ее имя безо всякого дополнительного синтаксиса.Оборотной стороной мощи и гибкости Ruby является более сложный синтаксис. Кроме
Библиотека оболочки
Библиотека оболочки DragAcceptFiles Функция DragAcceptFiles регистрирует окно, если оно принимает перетаскиваемые на него файлы. VOID DragAcceptFiles ( HWND hWnd , // дескриптор окна BOOL fAccept // опция разрешения принятия файлов ); Параметры hWnd - идентифицирует окно, регистрируемое, если оно принимает
Библиотека
Библиотека CoolReaderСайт: http://www.coolreader.orgРазмер: 1,6 МбСтатус: Freeware CoolReader – «читалка» почти идеальная, во всяком случае, для настольного компьютера. Варианта программы для PocketPC, увы, не предусмотрено – в этом случае вас выручит привычный HaaliReader. Кроме того, несколько огорчает