Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从TCPServer套接字读取的数据间歇性超时_Ruby_Sockets_Tcpserver - Fatal编程技术网

Ruby 从TCPServer套接字读取的数据间歇性超时

Ruby 从TCPServer套接字读取的数据间歇性超时,ruby,sockets,tcpserver,Ruby,Sockets,Tcpserver,我正在尝试向我创建的TCPServer发送请求,读取请求,并最终将其写入我正在创建的文件中。它有时工作,但经常超时。这会导致服务器挂起,因为我认为它会阻止服务器关闭套接字 所有的例子都表明,我可以通过挽救Errno::EAGAIN异常以及EOFError来处理这个问题。使用IO.select和retry处理Errno::EAGAIN在75%的时间内有效,但需要很长时间,并且在其他25%的时间内似乎超时。下面是我创建TCPServer、创建套接字和处理请求的代码。任何帮助都将不胜感激 server

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

所有的例子都表明,我可以通过挽救Errno::EAGAIN异常以及EOFError来处理这个问题。使用IO.select和retry处理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
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,因此我将将响应打印回客户端的时间移到我尝试读取套接字内容的代码之前,这允许客户端收到回复而不是超时。但是,看起来我仍然没有正确阅读请求。将继续。。。