0
我正在嘗試創建一個簡單的客戶端 - 服務器應用程序。我遇到了DRuby,我試了一下。似乎非常好,但我不確定是否允許雙向通信。分佈式ruby中的雙向通信
的功能,我想是這樣的:
- 服務器開始運行與對象服務的客戶端。
- 客戶端連接到服務器,獲取對象。
- 客戶端將自己的對象返回給服務器。
如果不打開端口到客戶端(變成服務器),可以進行第3步嗎?
問候,
我正在嘗試創建一個簡單的客戶端 - 服務器應用程序。我遇到了DRuby,我試了一下。似乎非常好,但我不確定是否允許雙向通信。分佈式ruby中的雙向通信
的功能,我想是這樣的:
如果不打開端口到客戶端(變成服務器),可以進行第3步嗎?
問候,
您可以在服務器中創建一個接口,所以當客戶端連接到它,可以在服務器改變一些狀態(通過它自己的對象)。
參見此代碼:
server.rb
require 'drb'
class Server
attr_accessor :object
def initialize()
@object = {:id => 'from server side'}
end
end
server = Server.new
DRb.start_service('druby://localhost:1992', server)
puts DRb.uri
begin
DRb.thread.join
rescue Exception
Process.kill("TERM", Process.pid)
end
client.rb
require 'drb'
@server = DRbObject.new(nil, "druby://localhost:1992")
DRb.start_service
puts @server.object
@server.object = {:id => "from client side"}
puts @server.object
輸出爲:
{:id=>"from server side"}
{:id=>"from client side"}
另外,DRuby
實現觀察者模式,所以您可以使服務器可觀察,包括DRb::DRbObservable
模塊。然後執行方法notify
通知所有觀察者,傳遞可序列化的對象(包括include DRb::DRbUndumped
)。在客戶端,我們可以添加觀察員服務器和實施方法的更新做一些與通知,看下面的例子:
server.rb
require 'drb'
require 'drb/observer'
class Server
include DRb::DRbObservable
attr_accessor :object
def initialize()
@object = {:id => 'from server side'}
end
def do_something
notify(Message.new("this is a notification"), Message.new("other notification"))
end
def notify(*args)
changed
notify_observers(*args)
end
class Message
include DRb::DRbUndumped
attr_reader :message
def initialize(message)
@message = message
end
end
end
server = Server.new
DRb.start_service('druby://localhost:1992', server)
puts DRb.uri
begin
DRb.thread.join
rescue Exception
Process.kill("TERM", Process.pid)
end
client.rb
require 'drb'
class MyObserver
include DRbUndumped
def update(*notifications)
puts "checking notifications ..."
notifications.each do |n|
puts n.message
end
end
end
@server = DRbObject.new(nil, "druby://localhost:1992")
DRb.start_service
@server.add_observer(MyObserver.new)
puts @server.object
@server.object = {:id => "from client side"}
puts @server.object
@server.do_something
輸出是:
{:id=>"from server side"}
{:id=>"from client side"}
checking notifications ...
this is a notification
other notification
有多個客戶端的服務器怎麼樣? –
它應該是一個具有多個客戶端的服務器,但我不明白你的意思(與問題)。這是一個應該有多個客戶端的服務器......我的問題是我可以使用DRuby來完成,或者我必須使用另一種方法,即HTTP。 –
對不起,這是一個愚蠢的評論,現在我想到了它。無論如何,你將需要在每個方向上的連接,我猜。 –