请高手指点 ruby 中长连接实现方式,看到之前@cdredfox有问到类似问题,之后留言说用 HTTPClient 可以处理,试了半天还是出错了: HTTPClient::ConnectTimeoutError (execution expired)
大家有使用过的请指点,有代码片段就更好了。
补充下:是想实现淘宝主动通知http://open.taobao.com/doc/detail.htm?id=1065
Thread.new{
$a=TCPServer.open(port)
}
Thread.new{
$b=TCPSocket.open(hostname, port)
}
Thread.new{
loop do
ready = select([$a], nil, nil,1)
next if ! ready
s = @c.recvfrom(65535)[0]
p s
end
}
Thread.new{
loop do
Thread.new($a.accept) { |c|
tran_rec(c) rescue log
}
end
}
def log
end
#2 楼 @yedingding 其实是想实现淘宝主动通知http://open.taobao.com/doc/detail.htm?id=1065 尝试了 httpclient,苦与超时啊~~貌似还是处理方式不对
#4 楼 @forward 看一下这个:https://github.com/igrigorik/em-http-request/ 支持 streaming request/response, 应该跟 taobao 的是一致的
以下代码是我之前实现的,完全可以实现长连接,使用没有问题的。
def self.taobao_stream
uri=URI(Settings.stream_sandbox_url)
params={"sign_method"=>"md5","app_key"=>Settings.appkey.to_s,"timestamp"=>Time.now.strftime("%Y-%m-%d %H:%M:%S")}.sort_by{|k|
k.to_s
}
post_params={}
params.map { |key, value| post_params[key]=value }
post_params["sign"]=gen_sign(post_params,Settings.secrt_code.to_s)
c = HTTPClient.new
#piper, pipew = IO.pipe
conn = c.post_async("http://stream.api.taobao.com/stream", post_params)
#Thread.new do
res = conn.pop
msg=""
while str = res.content.read(1)
unless(str=="\n")
msg=msg+str
next
end
p msg.delete("\r")
result_json=ActiveSupport::JSON.decode(msg.delete("\r"))
#TODO处理消息的代码,这里需要改成异步的,消息量大的时候,会产生消息积压
code=result_json["packet"]["code"]
case code
when 200
puts "服务器连接成功,连接的服务器为#{result_json["packet"]["msg"]}"
when 201
puts "接收到心跳包"
when 202
puts "有业务消息推送到,消息为#{result_json["packet"]["msg"]}"
TaobaoTrade.stream_trade_msg result_json["packet"]["msg"]
when 203
puts "有消息丢失,丢失的消息#{result_json["packet"]["msg"]}"
when 101
puts "需要重新连接,已到达最长的服务器连接时间"
when 102
puts "服务器正在升级,需要#{result_json["packet"]["msg"]}秒后进行重连"
when 103
puts "服务器主动断开连接,需要#{result_json["packet"]["msg"]}秒后进行重连"
when 104
puts "发起了新连接,服务器将要断开此连接,以新连接处理消息请求"
when 105
puts "产生大量的消息积压,服务器需要断开连接"
else
puts "服务器返回了未知的应答码:code=#{result_json["packet"]["code"]},msg=#{result_json["packet"]["msg"]}"
end
msg=""
end
#end
end