Отправка хэша с помощью eventmachine

Я хочу отправить хэш, заполненный данными, от клиента EventMachine на сервер. Проблема в том, что серверный метод receive_date просто печатает строку.

Сервер:

  def receive_data(data)
    send_data("Ready")
    puts data[:total]
  end

Клиент:

def receive_data(data)
  send_data( get_memory() )
end

def get_memory
  sigar = Sigar.new
  mem = sigar.mem
  swap = sigar.swap
  memory = { :total => (mem.total / 1024), :cat => "kwiki", :mouse => "squeaky" }
end

Эта строка: помещает данные [: total]

печатает только ноль


person rtacconi    schedule 18.09.2010    source источник


Ответы (3)


Почему бы вам не преобразовать хэш в строку JSON перед его отправкой и не преобразовать его обратно в хэш, когда сервер его получит?

person remi    schedule 18.09.2010
comment
Я думал о JSON, но мне было интересно, не будет ли EventMachine немного более волшебным. Чем ты. - person rtacconi; 18.09.2010

Вам необходимо сериализовать данные, которые вы отправляете по сети. Другими словами, обычно все выводится в виде простого ascii. В вашем случае вы можете использовать YAML для сериализации, поскольку хэш памяти содержит только символы ascii.

клиент:

требуется «ямл»

def receive_data(data)
  send_data(get_memory().to_yaml)
end

сервер:

требуется «ямл»

def receive_data(data)
  puts YAML.load(data)
end

Конечно, есть и другие методы сериализации, такие как JSON или что-то в этом роде.

person xinit    schedule 18.09.2010

Эй, rtaconni! Если вы хотите отправить данные из пользовательского объекта, вам придется действовать немного по-другому. Существует модуль DRbUndumped, который вы можете включить в свой класс, чтобы ваш класс стал маршалируемым.

Вы можете создать модуль и включить его в свой класс. http://www.ruby-doc.org/stdlib/libdoc/drb/rdoc/classes/DRb/DRbUndumped.html

ex.


require 'drb'
include DRbUndumped

class Sigar def initialize(*args) end

def ect end

end

Теперь вы можете использовать Marshal.dump(object) и Marshal.load(object), и пока файл/процесс получателя также является общим (например, требуется 'sigar'), он сможет работать с вашим объектом Ruby без необходимость делать дорогостоящие преобразования Объекта только для того, чтобы отправлять его туда и обратно.

Marshal.load(), Marshal.dump() работают почти со всеми объектами, есть некоторые особые случаи с сокетами, когда маршалинг сталкивается с исключениями.

Удачного взлома.

person newfront    schedule 04.02.2011