我有以下基于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
我觉得服务有些不对劲。客户输出什么没有任何想法?
答案 0 :(得分:2)
您的服务器和客户端都运行良好。例如,尝试与客户端连接到google.com:80
,您将看到它有效。
对于服务器,只需执行telnet localhost 10000
,您也会在此处看到服务器开始打印test data
。
但问题是您的服务器与您的客户端不兼容。您的客户端需要HTTP服务器,但您运行的服务器是一个简单的EM::Connection
,它不为HTTP客户端提供服务。
因此,当客户端连接时,它需要标准的HTTP响应,但它得到的只是test data
。所以代码的stream
部分永远不会被调用。
您需要运行HTTP服务器,或更改客户端以使用EM::Connection
而不是HttpRequest
。即客户端和服务器都需要使用相同的协议。