0

我想将填充有数据的哈希从 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

这一行: puts data[:total]

只打印零

4

3 回答 3

1

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

于 2010-09-18T12:51:19.500 回答
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 之类的。

于 2010-09-18T12:52:45.050 回答
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(object) 和 Marshal.load(object),并且只要收件人文件/进程也共享(例如,需要 'sigar'),那么它就可以使用您的 Ruby 对象,而无需必须对对象进行昂贵的转换才能来回发送它。

Marshal.load()、Marshal.dump() 几乎适用于所有对象,在 Sockets 的一些特殊情况下,Marshaling 会遇到异常。

快乐黑客。

于 2011-02-04T00:26:45.213 回答