Posted on February 16, 2007
Иногда надо чтоб сервер пнул клиента и он чтонить сделал. Например сервер запускает длительный процесс а потом пинает клиента что он завершён. Для этой цели и придуманы обратные вызовы. В Drb они делаются очень просто
Код сервера
require 'drb/drb'
#Слушаем на всех интерфейсах
URI="druby://:8787"
class Client
include DRb::DRbUndumped
def callback
@client.callback
end
def connect(clnt)
@client = clnt
end
end
class ClientFactory
def initialize
@clients = {}
end
def hello(name)
unless @clients.has_key? name
@clients[name] = Client.new
end
return @clients[name]
end
end
FRONT_OBJECT=ClientFactory.new
$SAFE = 1
DRb.start_service(URI, FRONT_OBJECT)
DRb.thread.join
И код клиента:
require 'drb/drb'
SERVER_URI="druby://10.26.11.58:8787"
class MeWaitCallback
include DRb::DRbUndumped
def initialize(uri = 'druby://localhost:8787')
DRb.start_service
@clients_service=DRbObject.new_with_uri(uri)
@client = @clients_service.hello("Zlo")
@client.connect(self)
@client.callback
end
def callback
puts "Yooo Hooo!"
end
end
MeWaitCallback.new
Вот и всё, всё очень просто ))
Tagged with: drb |
Posted on February 15, 2007
Некоторое время назад я пробовал себя в написании распределённых приложений ... всё закончилось довольно скучно и костылестроительно ... а сегодня читая мануалы по руби наткнулся на замечательную вещь - DRB. Итак:
Руби имеет собственный протокол для передачи между клиентом и сервером
druby
Рассмотрим кратенький экзампл из мануала:
Сервер:
require 'drb/drb'
# The URI for the server to connect to
URI="druby://:8787" #принимаем по всем интерфейсам на порт 8787
class TimeServer
def get_current_time
return Time.now
end
end
#Объект для экспорта
FRONT_OBJECT=TimeServer.new
$SAFE = 1 # Эвал нам не нужен, пока какой-то урод не прислал `rm -rf /`
#Стартуем сервер
DRb.start_service(URI, FRONT_OBJECT)
# И ждём пока drb не завершился
DRb.thread.join
Теперь код клиента:
require 'drb/drb'
# Куда цепляться
SERVER_URI="druby://localhost:8787"
#Стартуем сервер для ловли колобков (callback) ;)
DRb.start_service
timeserver = DRbObject.new_with_uri(SERVER_URI)
puts timeserver.get_current_time
И вуаля, получаем текущее время на сервере
В следующий раз я напишу о callbacks и передаче объектов
Tagged with: drb |