我想将填充了来自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
答案 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会遇到异常。
快乐黑客。