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

關閉這個連線。

使用 DRbProtocol 模組的 add_protocol 方法註冊新的協定。

有關其他協定的範例,請參閱 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) 按一下以切換來源

使用設定檔 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
open_server(uri, config, first=true) 按一下以切換來源

使用設定檔 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_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) 按一下以切換來源

使用設定檔 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
open_server(uri, config, first=true) 按一下以切換來源

使用設定檔 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_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