Я не специалист в этой области, но вот то, что я считаю, что происходит ....
браузер посылает запрос GET с полем заголовка «Connection: держать -в живых". Таким образом, браузер ожидает, что соединение будет поддерживать по крайней мере до тех пор, пока оно не получит полный фрагмент ответа. В соответствии с этим протоколом ответ сервера должен содержать заголовок, определяющий длину ответа, так что браузер знает, когда он получил полный ответ. После этого момента соединение можно закрыть без заботы обозревателя.
Исходный пример закрывает соединение слишком быстро, прежде чем браузер сможет подтвердить, что получен полный ответ. Любопытно, что если я запустил этот пример и несколько раз обновил свой браузер, он будет загружать примерно каждые 10 из 10 попыток. Возможно, это неустойчивое поведение связано с тем, что браузер иногда работает достаточно быстро, чтобы побить мой сервер, закрыв соединение.
Ниже приведен пример кода, который выполняет последовательно в браузере:
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
Спасибо. Я уже играю с ним, и он не генерирует эту ошибку. Мне все еще интересно, хотя исходный пример может быть исправлен. В C# можно вызвать 'Close' в сокете с таймаутом и устранить ту же проблему в мире .NET. – detunized
@detunized, я смущен, чтобы сказать, что не знаю. Надеюсь, кто-то придет и поможет нам обоим. –
Хотя это не отвечает на мой первоначальный вопрос, спасибо за обмен мыслями. В конце концов, я все равно это делал. Все равно было бы интересно узнать, почему это происходит и как его предотвратить. – detunized