модуль DRb::DRbProtocol
Module управляющий базовым сетевым протоколом(ами), используемым drb.
По умолчанию, drb использует протокол DRbTCPSocket. Другие протоколы могут быть определены. Протокол должен определить следующие методы класса:
[open(uri, config)] Open a client connection to the server at +uri+,
using configuration +config+. Return a protocol
instance for this connection.
[open_server(uri, config)] Open a server listening at +uri+,
using configuration +config+. Return a
protocol instance for this listener.
[uri_option(uri, config)] Take a URI, possibly containing an option
component (e.g. a trailing '?param=val'),
and return a [uri, option] tuple. Все эти методы должны вызывать ошибку DRbBadScheme, если URI не определяет протокол, который они поддерживают (например, «druby:» для стандартного протокола Ruby). Таким образом, модуль DRbProtocol, получив URI, определяет, какая реализация протокола обслуживает данный протокол.
Экземпляр протокола, возвращаемый методом open_server, должен иметь следующие методы:
- accept
-
Принимает новое подключение к серверу. Возвращает экземпляр протокола, способный взаимодействовать с клиентом.
- close
-
Закрывает соединение сервера.
- uri
-
Получает
URIдля этого сервера.
Экземпляр протокола, возвращаемый методом open, должен иметь следующие методы:
- send_request (ref, msg_id, arg, b)
-
Отправляет запрос на
refс заданным идентификатором сообщения и аргументами. Это наиболее просто реализуется путем вызова DRbMessage.send_request, предоставив поток, который распологается поверх текущего протокола. - recv_reply
-
Принимает ответ от сервера и возвращает его как пару [boolean-успех, значение-ответа]. Это наиболее просто реализуется путем вызова DRb.recv_reply, предоставив поток, который распологается поверх текущего протокола.
- alive?
-
Соединение всё ещё активно?
- close
-
Закрыть это соединение.
Экземпляр протокола, возвращаемый методом open_server().accept() должен иметь следующие методы:
- recv_request
-
Принимает запрос от клиента и возвращает кортеж [объект, сообщение, аргументы, блок]. Это наиболее просто реализуется путем вызова DRbMessage.recv_request, предоставив поток, который распологается поверх текущего протокола.
- send_reply(succ, result)
-
Отправить ответ клиенту. Это наиболее просто реализуется путем вызова DRbMessage.send_reply, предоставив поток, который распологается поверх текущего протокола.
- close
-
Закрыть это соединение.
Новый протокол регистрируется в модуле DRbProtocol с помощью метода add_protocol.
Примеры других протоколов см. в DRbUNIXSocket в drb/unix.rb, и HTTP0 в sample/http0.rb и sample/http0serv.rb в полном распределении drb.
Методы публичного класса
# File lib/drb/drb.rb, line 723 def add_protocol(prot) @protocol.push(prot) end
Добавить новый протокол в модуль DRbProtocol.
# File lib/drb/drb.rb, line 735
def open(uri, config, first=true)
@protocol.each do |prot|
begin
return prot.open(uri, config)
rescue DRbBadScheme
rescue DRbConnError
raise($!)
rescue
raise(DRbConnError, "#{uri} - #{$!.inspect}")
end
end
if first && (config[:auto_load] != false)
auto_load(uri)
return open(uri, config, false)
end
raise DRbBadURI, 'can\'t parse uri:' + uri
end Открыть клиентское соединение с uri с конфигурацией config.
Модуль DRbProtocol просит каждый зарегистрированный протокол по очереди попробовать открыть URI. Каждый протокол сигнализирует о том, что он не обрабатывает этот URI, вызвав ошибку DRbBadScheme. Если ни один протокол не распознает URI, то генерируется ошибка DRbBadURI. Если протокол принимает URI, но при открытии возникает ошибка, генерируется ошибка DRbConnError.
# File lib/drb/drb.rb, line 763
def open_server(uri, config, first=true)
@protocol.each do |prot|
begin
return prot.open_server(uri, config)
rescue DRbBadScheme
end
end
if first && (config[:auto_load] != false)
auto_load(uri)
return open_server(uri, config, false)
end
raise DRbBadURI, 'can\'t parse uri:' + uri
end Открыть сервер, ожидающий подключения по адресу uri с конфигурацией config.
Модуль DRbProtocol просит каждый зарегистрированный протокол по очереди попробовать открыть сервер по адресу URI. Каждый протокол сигнализирует о том, что он не обрабатывает этот URI, вызвав ошибку DRbBadScheme. Если ни один протокол не распознает URI, то генерируется ошибка DRbBadURI. Если протокол принимает URI, но при открытии возникает ошибка, подчинённая ошибка передаётся вызывающему методу.
# File lib/drb/drb.rb, line 784
def uri_option(uri, config, first=true)
@protocol.each do |prot|
begin
uri, opt = prot.uri_option(uri, config)
# opt = nil if opt == ''
return uri, opt
rescue DRbBadScheme
end
end
if first && (config[:auto_load] != false)
auto_load(uri)
return uri_option(uri, config, false)
end
raise DRbBadURI, 'can\'t parse uri:' + uri
end Разбор uri в пару [uri, option].
Модуль DRbProtocol просит каждый зарегистрированный протокол по очереди попробовать разобрать URI. Каждый протокол сигнализирует о том, что он не обрабатывает этот URI, вызвав ошибку DRbBadScheme. Если ни один протокол не распознаёт URI, то генерируется ошибка DRbBadURI.
Методы приватного экземпляра
# File lib/drb/drb.rb, line 723 def add_protocol(prot) @protocol.push(prot) end
Добавить новый протокол в модуль DRbProtocol.
# File lib/drb/drb.rb, line 735
def open(uri, config, first=true)
@protocol.each do |prot|
begin
return prot.open(uri, config)
rescue DRbBadScheme
rescue DRbConnError
raise($!)
rescue
raise(DRbConnError, "#{uri} - #{$!.inspect}")
end
end
if first && (config[:auto_load] != false)
auto_load(uri)
return open(uri, config, false)
end
raise DRbBadURI, 'can\'t parse uri:' + uri
end Открыть клиентское соединение с uri с конфигурацией config.
Модуль DRbProtocol просит каждый зарегистрированный протокол по очереди попробовать открыть URI. Каждый протокол сигнализирует о том, что он не обрабатывает этот URI, вызвав ошибку DRbBadScheme. Если ни один протокол не распознает URI, то генерируется ошибка DRbBadURI. Если протокол принимает URI, но при открытии возникает ошибка, генерируется ошибка DRbConnError.
# File lib/drb/drb.rb, line 763
def open_server(uri, config, first=true)
@protocol.each do |prot|
begin
return prot.open_server(uri, config)
rescue DRbBadScheme
end
end
if first && (config[:auto_load] != false)
auto_load(uri)
return open_server(uri, config, false)
end
raise DRbBadURI, 'can\'t parse uri:' + uri
end Открыть сервер, ожидающий подключения по адресу uri с конфигурацией config.
Модуль DRbProtocol просит каждый зарегистрированный протокол по очереди попробовать открыть сервер по адресу URI. Каждый протокол сигнализирует о том, что он не обрабатывает этот URI, вызвав ошибку DRbBadScheme. Если ни один протокол не распознаёт URI, то генерируется ошибка DRbBadURI. Если протокол принимает URI, но при открытии возникает ошибка, подчинённая ошибка передаётся вызывающему методу.
# File lib/drb/drb.rb, line 784
def uri_option(uri, config, first=true)
@protocol.each do |prot|
begin
uri, opt = prot.uri_option(uri, config)
# opt = nil if opt == ''
return uri, opt
rescue DRbBadScheme
end
end
if first && (config[:auto_load] != false)
auto_load(uri)
return uri_option(uri, config, false)
end
raise DRbBadURI, 'can\'t parse uri:' + uri
end Разбор uri в пару [uri, option].
Модуль DRbProtocol просит каждый зарегистрированный протокол по очереди попробовать разобрать URI. Каждый протокол сигнализирует о том, что он не обрабатывает этот URI, вызвав ошибку DRbBadScheme. Если ни один протокол не распознаёт URI, то генерируется ошибка DRbBadURI.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.