模块 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