我可以使用Ruby通过TCP发送对象吗?

时间:2013-02-24 01:33:04

标签: ruby tcp client-server distributed

我正在尝试通过TCP在Ruby上发送和“消息”对象,而我的客户端类根本看不到任何事情。我做错了什么?

我的消息类(我正在尝试发送)

class Message

  attr_reader :host_type, :command, :params  
  attr_accessor :host_type, :command, :params

  def initialize(host_type, command, params)
    @host_type = host_type
    @command = command
    @params = params
  end
end

我的“服务器”类

require 'socket' 
require_relative 'message'               


class TCP_connection 

  def start_listening
    puts "listening"
    socket = TCPServer.open(2000) 
    loop {                          
      Thread.start(socket.accept) do |message|
        puts message.command
      end
    }
  end

  def send_message
    hostname = 'localhost'
    port = 2000

    s = TCPSocket.open(hostname, port)

    message = Message.new("PARAM A", "PARAM B", "PARAM C")

    s.print(message)

    s.close 
  end

end

2 个答案:

答案 0 :(得分:4)

下面是通过json进行客户端服务器通信的示例。你会期待像RuntimeError: {"method1"=>"param1"}这样的东西。而不是引发错误,用服务器逻辑处理这个json。

服务器

require 'socket'
require 'json'

server = TCPServer.open(2000)
loop {
  client = server.accept
  params = JSON.parse(client.gets)
  raise params.inspect
}

<强>客户端

require 'socket'
require 'json'

host = 'localhost'
port = 2000

s = TCPSocket.open(host, port)

request = { 'method1' => 'param1' }.to_json
s.print(request)

s.close

答案 1 :(得分:0)

您需要序列化您的对象。最便携的方法是使用YAML。首先,需要yaml库:

require "yaml"

比,将s.print(message)替换为s.print(YAML.dump(message))