2013-06-01 65 views
0

我正在嘗試創建一個簡單的客戶端 - 服務器應用程序。我遇到了DRuby,我試了一下。似乎非常好,但我不確定是否允許雙向通信。分佈式ruby中的雙向通信

的功能,我想是這樣的:

  1. 服務器開始運行與對象服務的客戶端。
  2. 客戶端連接到服務器,獲取對象。
  3. 客戶端將自己的對象返回給服務器。

如果不打開端口到客戶端(變成服務器),可以進行第3步嗎?

問候,

+0

有多個客戶端的服務器怎麼樣? –

+0

它應該是一個具有多個客戶端的服務器,但我不明白你的意思(與問題)。這是一個應該有多個客戶端的服務器......我的問題是我可以使用DRuby來完成,或者我必須使用另一種方法,即HTTP。 –

+0

對不起,這是一個愚蠢的評論,現在我想到了它。無論如何,你將需要在每個方向上的連接,我猜。 –

回答

1

您可以在服務器中創建一個接口,所以當客戶端連接到它,可以在服務器改變一些狀態(通過它自己的對象)。

參見此代碼:

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