Двунаправленная связь в распределенном рубине

Я пытаюсь создать простое клиент-серверное приложение. Я столкнулся с DRuby, и я пробую это. Кажется действительно хорошим, однако я не уверен, разрешено ли двунаправленное общение.

Функциональность, которую я хочу, заключается в следующем:

  1. Сервер начинает работать, обслуживая клиента с объектом.
  2. Клиент подключается к серверу, забирает объект.
  3. Клиент возвращает свой собственный объект на сервер.

Возможен ли этот шаг № 3 без открытия порта для клиента (превращения в сервер)?

С Уважением,

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). На стороне клиента мы можем добавить наблюдателя на сервер и реализовать метод update, чтобы сделать что-то с уведомлением, см. Этот пример:

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
Другие вопросы по тегам