Ruby中的EventMachine流式套接字服务无法正常工作

时间:2013-06-22 23:08:41

标签: ruby sockets eventmachine

我有以下基于EventMachine的Ruby客户端,但连接到服务器时没有输出:

EventMachine.run do
  conn = EventMachine::HttpRequest.new('http://localhost:10000')
  http = conn.get

  http.stream do |data|
    puts data  # THIS SHOULD BE OUTPUTTING SOMETHING
  end

  trap("INT")  { puts 'INT'; http.close; EventMachine.stop }
  trap("TERM") { puts 'TERM'; http.close; EventMachine.stop }
end

服务:

module Simulation
  class QuoteService < EM::Connection
    def post_init
      puts "CONNECTION ESTABLISHED"  # THIS DOES OUTPUT

      EventMachine.add_periodic_timer(1) do
        puts "test data"  # THIS DOES OUTPUT
        send_data("test data")
      end
    end
  end
end

EventMachine.run do
  Signal.trap("INT")  { EventMachine.stop }
  Signal.trap("TERM") { EventMachine.stop }

  EventMachine.start_server('0.0.0.0', 10000, Simulation::QuoteService)
end

我觉得服务有些不对劲。客户输出什么没有任何想法?

1 个答案:

答案 0 :(得分:2)

您的服务器和客户端都运行良好。例如,尝试与客户端连接到google.com:80,您将看到它有效。

对于服务器,只需执行telnet localhost 10000,您也会在此处看到服务器开始打印test data

但问题是您的服务器与您的客户端不兼容。您的客户端需要HTTP服务器,但您运行的服务器是一个简单的EM::Connection,它不为HTTP客户端提供服务。

因此,当客户端连接时,它需要标准的HTTP响应,但它得到的只是test data。所以代码的stream部分永远不会被调用。

您需要运行HTTP服务器,或更改客户端以使用EM::Connection而不是HttpRequest。即客户端和服务器都需要使用相同的协议。