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

公共类方法

add_protocol(prot) 单击以切换源

DRbProtocol 模块添加一个新协议。

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

使用配置 configuri 打开一个客户端连接。

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
open_server(uri, config, first=true) 单击以切换源

使用配置 configuri 处打开一个侦听连接的服务器。

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_option(uri, config, first=true) 单击以切换源

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

私有实例方法

add_protocol(prot) 单击以切换源

DRbProtocol 模块添加一个新协议。

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

使用配置 configuri 打开一个客户端连接。

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
open_server(uri, config, first=true) 单击以切换源

使用配置 configuri 处打开一个侦听连接的服务器。

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_option(uri, config, first=true) 单击以切换源

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