0

我有以下基于 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

我认为该服务有问题。任何想法为什么客户什么都不输出?

4

1 回答 1

2

您的服务器和客户端都可以正常工作。例如,尝试与客户端连接,google.com:80您将看到它有效。

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

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

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

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

于 2013-06-23T07:01:01.470 回答