模块 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.
如果 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 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 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 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, option] 对。
DRbProtocol
模块依次询问每个已注册的协议尝试解析 URI
。每个协议通过引发 DRbBadScheme
错误来表示它不处理该 URI
。如果没有协议识别 URI
,则引发 DRbBadURI
错误。
# File 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 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 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 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, option] 对。
DRbProtocol
模块依次询问每个已注册的协议尝试解析 URI
。每个协议通过引发 DRbBadScheme
错误来表示它不处理该 URI
。如果没有协议识别 URI
,则引发 DRbBadURI
错误。
# File 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