2011-01-06 109 views
1

我有一个非常基本的TCP服务器在Ruby中实现。一般情况下,它的功能应该是这样,但每过一段时间,我都会收到“与服务器的连接在页面加载时被重置”错误。我有一种感觉,它与close联系过早终止连接。如果是这样,我该如何等待所有的数据发送?或者是别的什么?如何防止“连接重置”错误?

require 'socket' 

server = TCPServer.new('', 80) 
loop do 
    session = server.accept 
    begin 
     session.print Time.now 
    ensure 
     session.close 
    end 
end 

回答

1

我怀疑这是因为浏览器正在期待HTTP头响应& c。奇怪的是,如果你在“确保”睡一秒钟之前,你可以每次都发生“重置”错误。

如何解决这个问题取决于你在做什么。如果这不是一个HTTP服务器,那么请不要使用浏览器来测试它。相反,使用telnet或写一个小程序。如果它是一个HTTP服务器,那么看一下webrick,这是内置于Ruby MRI> = 1.8的。具体方法如下:我

#!/usr/bin/ruby1.8 

require 'webrick' 

# This class handles time requests 

class TimeServer < WEBrick::HTTPServlet::AbstractServlet 

    def do_GET(request, response) 
    response.status = 200 
    response['Content-Type'] = 'text/plain' 
    response.body = Time.now.to_s 
    end 

end 

# Create the server. There are many other options, if you need them. 
server = WEBrick::HTTPServer.new(:Port=>8080) 

# Whenever a request comes in for the root page, use TimeServer to handle it 
server.mount('/', TimeServer) 

# Finally, start the server. Does not normally return. 
server.start 
+0

谢谢。我已经在玩它,它不会产生这个错误。尽管如此,我仍然很好奇,如果最初的例子可以修复。在C#中,有可能在超时套接字上调用`Close`,它可以解决.NET世界中同样的问题。 – detunized 2011-01-06 21:11:07

2

我不是这方面的专家,但这里是我认为正在发生的事情....

浏览器发送带有头字段的GET请求“连接:保持-活”。因此,浏览器希望至少保持连接处于活动状态,直到它收到完整的响应。在此协议下,服务器响应必须包含一个指定响应长度的标头,以便浏览器知道它何时收到完整的响应。在这之后,连接可以在浏览器不关心的情况下关闭。

原始示例在浏览器验证收到完整响应之前关闭连接的速度太快。奇怪的是,如果我运行该示例并多次刷新浏览器,它将每10次尝试中就有1次加载。也许这种不稳定的行为是由于浏览器偶尔执行速度足以击败我的服务器关闭连接。

下面是在我的浏览器一贯执行的代码示例:

require 'socket' 

response = %{HTTP/1.1 200 OK 
Content-Type: text;charset=utf-8 
Content-Length: 12 

Hello World! 
} 

server = TCPServer.open(80) 

loop do 
    client = server.accept 
    client.puts response 
    sleep 1 
    client.close 
end 
0

此外,要注意的是,包括在响应头Connection: close似乎并没有帮助我在所有与此连接复位的错误我浏览器(FFv3.6)。我必须包含content-length标题字段,并且包含sleep方法,以便在连接关闭中引入一些延迟,以便在浏览器中获得一致的响应。

相关问题