首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分布式红宝石中的双向通信

分布式红宝石中的双向通信
EN

Stack Overflow用户
提问于 2013-06-01 16:22:28
回答 1查看 299关注 0票数 1

我正在尝试创建一个简单的客户机-服务器应用程序。我偶然发现了DRuby,我试了一试。似乎真的很好,但我不确定是否允许双向交流。

我想要的功能如下:

  1. 服务器开始使用对象运行服务客户端。
  2. 客户端连接到服务器,接受对象。
  3. 客户端将自己的对象返回给服务器。

在不向客户端打开端口(变成服务器)的情况下,这个No3步骤可以吗?

致以敬意,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 20:52:26

您可以在服务器中创建一个接口,因此当客户端连接到它时,可以更改服务器中的某些状态(传递它自己的对象)。

请参阅以下代码:

server.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
require 'drb'
@server = DRbObject.new(nil, "druby://localhost:1992")
DRb.start_service

puts @server.object

@server.object = {:id => "from client side"}

puts @server.object

产出如下:

代码语言:javascript
复制
{:id=>"from server side"}
{:id=>"from client side"}

另外,DRuby实现了观察者模式,因此您可以在类服务器中包括DRb::DRbObservable模块来观察您的服务器。然后实现notify方法,通知所有观察者,传递可以序列化的对象(包括include DRb::DRbUndumped)。在客户端,我们可以向服务器添加观察者,并实现方法更新来处理通知,参见下面的示例:

server.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
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

产出如下:

代码语言:javascript
复制
{:id=>"from server side"}
{:id=>"from client side"}
checking notifications ...
this is a notification
other notification
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16874715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档