Отправка хэша с помощью eventmachine - PullRequest
0 голосов
/ 18 сентября 2010

Я хочу отправить хеш с данными из клиента 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

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

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

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

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

client:

require 'yaml'

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

server:

require 'yaml'

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

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

1 голос
/ 18 сентября 2010

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

0 голосов
/ 04 февраля 2011

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

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

ex.

<code>
require 'drb'
include DRbUndumped</p>

<p>class Sigar
  def initialize(*args)
  end</p>

<p>def ect
  end</p>

<p>end

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

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

Счастливого взлома.

...