Я думаю, что смог воспроизвести проблему, применив небольшое изменение к коду, поэтому теперь он не работает на моей машине и демонстрирует то же поведение, что и в вашей среде.Я просто изменил out.println
вызов на более простой out.print
, и вот, программа зависает после отправки запроса, но до последнего println
вызова.
Насколько я помню, HTTP-запросы должны содержать пустую строку после заголовков, где разделитель строк должен быть парой символов \r\n
.Я предполагаю, что ваша среда такова, что println
не отправляет правильные разделители строк (вы можете проверить значение System.getProperty("line.separator")
, чтобы проверить, какие из них используются в вашей системе), поэтому запрос интерпретируется сервером как неполныйи вы ничего не получите на стороне ввода.Некоторые серверы довольно просты и принимают только \n
в качестве разделителя строк, но если вам случится отправить \n
явно и \r\n
неявно (с помощью println
), то ваша предположительно пустая строка содержит символ \r
ибольше не рассматривается как пустой, что может привести к сбою в запросе, из-за чего сервер не может отправлять обратно любой ответ.
Поэтому я советую использовать print
и явно отправлять правильные разделители строк.Кроме того, очень вероятно, что вам нужно добавить вызов к flush
, возможно, потому, что между выводом есть пустая строка - я не знаю, но без вызова flush
моя программа все еще зависает.Итак, чтобы подвести итог, должно работать следующее:
// send request
out.print("GET /index.html HTTP/1.0\r\n\r\n");
out.flush();
// read one line of input
System.out.println("Response from " + line + ": " + in.readLine());
По крайней мере, я могу подтвердить, что программа работает на моем компьютере и с этими изменениями.