模組 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。
公開類別方法
將新的協定新增至 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