【问题标题】:Sending a hash using eventmachine使用 eventmachine 发送哈希
【发布时间】:2010-09-18 12:40:21
【问题描述】:

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

只打印零

【问题讨论】:

    标签: ruby hash eventmachine


    【解决方案1】:

    为什么不在发送前将Hash转成JSON字符串,服务器收到后再转回Hash?

    【讨论】:

    • 我在考虑 JSON,但我想知道 EventMachine 是否更神奇一点。比你。
    【解决方案2】:

    您需要对通过网络发送的数据进行序列化。换句话说,通常所有内容都以纯 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 之类的。

    【讨论】:

      【解决方案3】:

      你好 rtaconni, 如果您想从自定义对象发送数据,您必须做一些不同的事情。您可以在您的课程中包含 DRbUndumped 模块,以使您的课程成为可编组的。

      您可以构建模块并将其包含在您的课程中。 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 会遇到异常。

      快乐黑客。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 2012-06-04
        相关资源
        最近更新 更多