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]

nil のみを表示

4

3 に答える 3

1

送信する前に Hash を JSON 文字列に変換し、サーバーが受信したときに Hash に変換し直してはどうでしょうか?

于 2010-09-18T12:51:19.500 に答える
1

ネットワーク経由で送信するデータをシリアル化する必要があります。つまり、通常はすべてがプレーン ascii として出力されます。あなたの場合、メモリハッシュにはASCII文字しか含まれていないため、シリアライゼーションにYAMLを使用できます。

クライアント:

「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 さん、カスタム オブジェクトからデータを送信する場合は、少し異なる操作を行う必要があります。クラスを Marshalable にするためにクラスに含めることができる 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) を使用できるようになり、受信者のファイル/プロセスも共有されている限り (たとえば、require 'sigar')、Ruby オブジェクトを使用することができます。オブジェクトをやり取りするためだけに、オブジェクトにコストのかかる変換を行う必要があります。

Marshal.load()、Marshal.dump() はほとんどすべてのオブジェクトで動作します。マーシャリングで例外が発生するソケットの特殊なケースがいくつかあります。

ハッピーハッキング。

于 2011-02-04T00:26:45.213 に答える