从TCPServer套接字读取会间歇性地超时

时间:2014-08-15 21:59:01

标签: ruby sockets tcpserver

我正在尝试向我创建的TCPServer发送请求,读取请求,并最终将其写入我正在创建的文件中。它在某些时候有效,但经常出现故障。这会导致服务器挂起,因为我认为它阻止服务器关闭套接字。

所有唯一的例子表明我通过拯救Errno :: EAGAIN异常以及EOFError来处理这个问题。使用IO.select处理Errno :: EAGAIN并重试75%的时间,但需要很长时间,并且似乎在其他25%的时间内超时。下面是我创建TCPServer,创建套接字和处理请求的代码。任何帮助将不胜感激。

server = TCPServer.new('127.0.0.1', PORT)

while socket_events = select([server], nil, nil)

    puts "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"

    Thread.new(server.accept) do |socket|


        request = socket.gets 
        content_length = socket.readpartial(1024).match(/Content-Length: \d+/).to_s.split(': ')
        content_length = content_length[1].to_i   
        puts content_length

        @content_file = File.new("#{PATH}/#{SecureRandom.uuid}", "w") 
        @buffer = []
        begin
          @buffer << socket.read_nonblock(content_length)
          puts "buffer is #{@buffer}"
        rescue  Errno::EAGAIN => e
          puts "#{e.message}"
          puts "#{e.backtrace}"
          IO.select([socket])
          retry
        rescue EOFError
          $STDOUT.puts "-" * 50
          puts "request data is #{@buffer}"    
          $STDOUT.puts "-" * 50
          break  
        end

        response = "" #@content_file.path
        headers = ["HTTP/1.1 200 OK", "server: ruby", "Content-Type: text/plain", "Content-Length: #{response.bytesize}\r\n\r\n"].join("\r\n")

        socket.print headers

        socket.print response  



        @content_file.close
        socket.close


  end

end

1 个答案:

答案 0 :(得分:0)

好的,所以超时与客户端等待响应无关,这与读取套接字无关。