Чтение из сокета TCPServer периодически истекает

Я пытаюсь отправить запрос на созданный мной TCPServer, прочитать запрос и, в конечном итоге, записать его в файл, который я создаю. Это работает некоторое время, но время ожидания часто. Затем это приводит к зависанию сервера, поскольку я считаю, что он блокирует закрытие сокета сервером.

Все единственные примеры предполагают, что я справляюсь с этим, спасая исключение Errno::EAGAIN, а также EOFError. Обработка Errno::EAGAIN с использованием IO.select и повторной попытки работает в 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

person Graham    schedule 15.08.2014    source источник
comment
моя версия рубина 2.1   -  person Graham    schedule 18.08.2014
comment
Поэтому я переместил печать ответа обратно клиенту перед кодом, в котором я пытаюсь прочитать содержимое сокетов, это позволило клиенту получить ответ, а не тайм-аут. Однако, похоже, я все еще неправильно читаю запрос. Будет продолжать...   -  person Graham    schedule 18.08.2014


Ответы (1)


Итак, тайм-аут был связан с тем, что клиент ждал ответа, который не имел ничего общего с чтением сокета.

person Graham    schedule 18.08.2014