1

私のコードでは、クライアントからコンマで区切られたデータのストリームを受け取りました。各フィールドは異なるデータ型です。受信したら、それらを分割して配列に書き込みます。次のようにコーディングします。

 require 'socket'

s = TCPSocket.open('localhost',2000)
time = Time.now.to_i
s.puts(cf,PUB,#{time},001.41011,N,103.76822)
s.close

eventmachineサーバーでは、次のようにコーディングします。

require 'rubygems'
require 'eventmachine'
require './Load2MySQL.rb'

 module EchoServer

   def post_init
     puts "-- someone connected to the echo server!"
   end

   def receive_data data
       loc = Array.new(6)
       loc = data.split(',').to_a     

     wr2db(loc[0], loc[1], loc[2], loc[3], loc[4], loc[5])

   end

   def unbind
     puts "-- someone disconnected from the echo server!"
     close_connection
#     EventMachine::stop_event_loop
   end
 end

 EventMachine::run {
   EventMachine::start_server "0.0.0.0", 2000, EchoServer
 }

そうすることで、配列内のすべての要素が文字列に変換されることを発見しました。データ型を保持するにはどうすればよいですか?

よろしく、New2RoR

4

2 に答える 2

0

その理由は、実際には文字列の配列を返すsplitメソッドの使用です。唯一の方法は、各要素の型を値に沿って送信するか、すでにわかっている場合は、次のように分割後に型を強制することです。

float_val = loc(5).to_f

3 つ目の方法は、Ruby の CSVを使用して文字列を生成および解析することです。値を読み取り、該当する場合は浮動小数点または整数に変換するフィールド コンバーターを使用できます。

loc = Array.new(6)また、 Ruby で行う必要はないと思います。さらに、確立された mysql アダプターの 1 つを使用している場合、それが問題である場合、保存する前に型キャストについて心配する必要はありません。

于 2012-08-01T09:23:49.643 に答える
0

TCP ソケット経由で送信する前に、オブジェクトをマーシャリングする必要があります。送信時はデータ使用Marshal.dump(data)、受信時はデータ使用Marshal.load(data)。詳細については、Ruby ドキュメントを参照してください。また、アプリケーションによっては、 Ruby DRBの使用に関心があるかもしれません。

于 2012-08-01T16:05:21.220 に答える