我正在尝试向我创建的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
答案 0 :(得分:0)
好的,所以超时与客户端等待响应无关,这与读取套接字无关。