使用eventmachine发送哈希

时间:2010-09-18 12:40:21

标签: ruby hash 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]

仅打印nil

3 个答案:

答案 0 :(得分:1)

为什么不在发送之前将Hash转换为JSON字符串,并在服务器接收时将其转换回Hash?

答案 1 :(得分:1)

您需要序列化通过网络发送的数据。换句话说,通常一切都以普通的ascii输出。在您的情况下,您可以使用YAML进行序列化,因为您的内存哈希只包含ascii字符。

客户端:

要求'yaml'

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

服务器:

要求'yaml'

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

当然还有其他的序列化方法,比如JSON,或者什么。

答案 2 :(得分:0)

嘿rtaconni, 如果要从自定义对象发送数据,则必须执行一些不同的操作。您可以在课程中包含DRbUndumped模块,以使您的班级成为Marshalable。

您可以构建模块并将其包含在您的课程中。 http://www.ruby-doc.org/stdlib/libdoc/drb/rdoc/classes/DRb/DRbUndumped.html

离。


require 'drb'
include DRbUndumped

class Sigar def initialize(*args) end

def ect end

end

现在您可以使用Marshal.dump(对象)和Marshal.load(对象),只要收件人文件/进程也共享(例如,需要'sigar'),它就可以使用你的Ruby对象,无需对Object进行昂贵的转换,只是为了来回发送它。

Marshal.load(),Marshal.dump()适用于几乎所有的对象,有一些特殊情况下的套接字,其中Marshaling会遇到异常。

快乐黑客。