модуль DRb::DRbProtocol
Модуль управления базовым(и) сетевым протоколом(ами), используемым 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
-
Получить ответ от сервера и вернуть его как пару [успех-булево, ответ-значение]. Это проще всего реализовать, вызвав 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, опция].
Модуль 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, опция].
Модуль DRbProtocol запрашивает каждый зарегистрированный протокол по очереди, чтобы попытаться разобрать URI. Каждый протокол указывает, что он не обрабатывает этот URI, сгенерировав ошибку DRbBadScheme. Если ни один протокол не распознаёт URI, то генерируется ошибка DRbBadURI.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.