Ruby ruby 长连接实现

forward · 2012年08月12日 · 最后由 rubiniuer 回复于 2012年12月05日 · 5619 次阅读

请高手指点 ruby 中长连接实现方式,看到之前@cdredfox有问到类似问题,之后留言说用 HTTPClient 可以处理,试了半天还是出错了: HTTPClient::ConnectTimeoutError (execution expired)

大家有使用过的请指点,有代码片段就更好了。

补充下:是想实现淘宝主动通知http://open.taobao.com/doc/detail.htm?id=1065

路过,只知道 websocket

需求描述不够清楚

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,苦与超时啊~~貌似还是处理方式不对

#1 楼 @lidashuang 看了下 websocket 的文档,要服务端与客户端同步实现吧。我这个场景好像不太适合

#4 楼 @forward 看一下这个:https://github.com/igrigorik/em-http-request/ 支持 streaming request/response, 应该跟 taobao 的是一致的

@forward

以下代码是我之前实现的,完全可以实现长连接,使用没有问题的。

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

#7 楼 @cdredfox hi,请教一下,你这里的 httpclient 用的是哪个 gem

需要 登录 后方可回复, 如果你还没有账号请 注册新账号