Ruby 从TCPServer套接字读取的数据间歇性超时
我正在尝试向我创建的TCPServer发送请求,读取请求,并最终将其写入我正在创建的文件中。它有时工作,但经常超时。这会导致服务器挂起,因为我认为它会阻止服务器关闭套接字 所有的例子都表明,我可以通过挽救Errno::EAGAIN异常以及EOFError来处理这个问题。使用IO.select和retry处理Errno::EAGAIN在75%的时间内有效,但需要很长时间,并且在其他25%的时间内似乎超时。下面是我创建TCPServer、创建套接字和处理请求的代码。任何帮助都将不胜感激Ruby 从TCPServer套接字读取的数据间歇性超时,ruby,sockets,tcpserver,Ruby,Sockets,Tcpserver,我正在尝试向我创建的TCPServer发送请求,读取请求,并最终将其写入我正在创建的文件中。它有时工作,但经常超时。这会导致服务器挂起,因为我认为它会阻止服务器关闭套接字 所有的例子都表明,我可以通过挽救Errno::EAGAIN异常以及EOFError来处理这个问题。使用IO.select和retry处理Errno::EAGAIN在75%的时间内有效,但需要很长时间,并且在其他25%的时间内似乎超时。下面是我创建TCPServer、创建套接字和处理请求的代码。任何帮助都将不胜感激 server
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
server=TCPServer.new('127.0.0.1',端口)
而socket_events=select([server],nil,nil)
放置“HTTP/1.1 200/OK\r\n内容类型:text/html\r\n\r\n”
Thread.new(server.accept)do | socket|
request=socket.get
content_length=socket.readpartial(1024)。将(/content length:\d+/)匹配到_.split(“:”)
内容长度=内容长度[1]。至
将内容放入长度
@content_file=file.new(“#{PATH}/#{SecureRandom.uuid}”,“w”)
@缓冲区=[]
开始
@缓冲区e
放入“#{e.message}”
放置“#{e.backtrace}”
IO.选择([socket])
重试
救援埃奥费罗
$STDOUT.puts“-”*50
放置“请求数据为#{@buffer}”
$STDOUT.puts“-”*50
打破
终止
响应=“#@content_file.path
headers=[“HTTP/1.1 200 OK”,“服务器:ruby”,“内容类型:text/plain”,“内容长度:{response.bytesize}\r\n\r\n”].join(“\r\n”)
socket.print标题
socket.print响应
@content\u file.close
闭嘴
终止
终止
好的,因此超时与客户端等待响应有关,而响应与读取套接字无关。我的ruby版本是2.1,因此我将将响应打印回客户端的时间移到我尝试读取套接字内容的代码之前,这允许客户端收到回复而不是超时。但是,看起来我仍然没有正确阅读请求。将继续。。。