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

您需要在通过 TCP 套接字发送之前编组对象。发送数据时使用Marshal.dump(data)和接收数据时使用Marshal.load(data)。查看ruby​​ 文档以获取更多信息。此外,根据您的应用程序,您可能对使用Ruby DRB感兴趣。

于 2012-08-01T16:05:21.220 回答
0

原因是使用了split方法,它确实返回了一个字符串数组。唯一的方法是将每个元素的类型与值一起发送,或者,如果您已经知道,请在拆分后强制类型,如下所示:

float_val = loc(5).to_f

第三种方法是使用Ruby 的 CSV来生成和解析字符串。它允许您使用字段转换器来读取值并将它们转换为浮点数或整数(如果适用)。

另外,我认为您不需要loc = Array.new(6)在 Ruby 中执行此操作。此外,如果您使用的是已建立的 mysql 适配器之一,如果这是您的问题,您不必担心存储前的类型转换,它会为您完成。

于 2012-08-01T09:23:49.643 回答