Двунаправленная связь в распределенном рубине
Я пытаюсь создать простое клиент-серверное приложение. Я столкнулся с DRuby, и я пробую это. Кажется действительно хорошим, однако я не уверен, разрешено ли двунаправленное общение.
Функциональность, которую я хочу, заключается в следующем:
- Сервер начинает работать, обслуживая клиента с объектом.
- Клиент подключается к серверу, забирает объект.
- Клиент возвращает свой собственный объект на сервер.
Возможен ли этот шаг № 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