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

公共类方法

add_protocol(prot) 点击切换源代码

DRbProtocol 模块添加新协议。

# File drb-2.2.1/lib/drb/drb.rb, line 724
def add_protocol(prot)
  @protocol.push(prot)
end
open(uri, config, first=true) 点击切换源代码

使用配置 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
open_server(uri, config, first=true) 点击切换源代码

使用配置 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_option(uri, config, first=true) 点击切换源代码

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

私有实例方法

add_protocol(prot) 点击切换源代码

DRbProtocol 模块添加新协议。

# File drb-2.2.1/lib/drb/drb.rb, line 724
def add_protocol(prot)
  @protocol.push(prot)
end
open(uri, config, first=true) 点击切换源代码

使用配置 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
open_server(uri, config, first=true) 点击切换源代码

使用配置 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_option(uri, config, first=true) 点击切换源代码

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