模块 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.
如果 URI 没有标识它们支持的协议(例如,标准 Ruby 协议的“druby:”),所有这些方法都应引发 DRbBadScheme 错误。这就是 DRbProtocol 模块如何根据 URI 确定哪个协议实现服务于该协议。
open_server 返回的协议实例必须具有以下方法
- accept
-
接受到服务器的新连接。返回一个能够与客户端通信的协议实例。
- close
-
关闭服务器连接。
- uri
-
获取此服务器的 URI。
open 返回的协议实例必须具有以下方法
- send_request (ref, msg_id, arg, b)
-
使用给定的消息 ID 和参数向
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
-
关闭此连接。
使用 add_protocol 方法将新协议注册到 DRbProtocol 模块。
有关其他协议的示例,请参阅 drb/unix.rb 中的 DRbUNIXSocket 和完整 drb 发行版中 sample/http0.rb 和 sample/http0serv.rb 中的 HTTP0。
公共类方法
向 DRbProtocol 模块添加新协议。
# File drb-2.2.1/lib/drb/drb.rb, line 724 def add_protocol(prot) @protocol.push(prot) end
使用配置 config 打开到 uri 的客户端连接。
DRbProtocol 模块依次询问每个已注册的协议是否尝试打开 URI。每个协议通过引发 DRbBadScheme 错误来表示它不处理该 URI。如果没有协议识别该 URI,则会引发 DRbBadURI 错误。如果某个协议接受该 URI,但在打开时发生错误,则会引发 DRbConnError。
# File drb-2.2.1/lib/drb/drb.rb, line 736 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
使用配置 config 打开一个服务器,监听 uri 处的连接。
DRbProtocol 模块依次询问每个已注册的协议是否尝试在 URI 处打开服务器。每个协议通过引发 DRbBadScheme 错误来表示它不处理该 URI。如果没有协议识别该 URI,则会引发 DRbBadURI 错误。如果某个协议接受该 URI,但在打开时发生错误,则会将底层错误传递给调用者。
# File drb-2.2.1/lib/drb/drb.rb, line 764 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 解析为 [uri,选项] 对。
DRbProtocol 模块依次询问每个已注册的协议是否尝试解析 URI。每个协议通过引发 DRbBadScheme 错误来表示它不处理该 URI。如果没有协议识别该 URI,则会引发 DRbBadURI 错误。
# File drb-2.2.1/lib/drb/drb.rb, line 785 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
私有实例方法
向 DRbProtocol 模块添加新协议。
# File drb-2.2.1/lib/drb/drb.rb, line 724 def add_protocol(prot) @protocol.push(prot) end
使用配置 config 打开到 uri 的客户端连接。
DRbProtocol 模块依次询问每个已注册的协议是否尝试打开 URI。每个协议通过引发 DRbBadScheme 错误来表示它不处理该 URI。如果没有协议识别该 URI,则会引发 DRbBadURI 错误。如果某个协议接受该 URI,但在打开时发生错误,则会引发 DRbConnError。
# File drb-2.2.1/lib/drb/drb.rb, line 736 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
使用配置 config 打开一个服务器,监听 uri 处的连接。
DRbProtocol 模块依次询问每个已注册的协议是否尝试在 URI 处打开服务器。每个协议通过引发 DRbBadScheme 错误来表示它不处理该 URI。如果没有协议识别该 URI,则会引发 DRbBadURI 错误。如果某个协议接受该 URI,但在打开时发生错误,则会将底层错误传递给调用者。
# File drb-2.2.1/lib/drb/drb.rb, line 764 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 解析为 [uri,选项] 对。
DRbProtocol 模块依次询问每个已注册的协议是否尝试解析 URI。每个协议通过引发 DRbBadScheme 错误来表示它不处理该 URI。如果没有协议识别该 URI,则会引发 DRbBadURI 错误。
# File drb-2.2.1/lib/drb/drb.rb, line 785 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