Java, сокеты, BufferedReader и readline подвешивают … :(

Я утверждал бы, что первоочередной задачей не является производительность, но безопасность. Можно сделать много ошибок с массивами (рассмотрите изменение размеров, например), где вектор сохранил бы Вас много боли.

5
задан jettero 16 October 2009 в 12:35
поделиться

4 ответа

Ваша проблема заключается в кодировании содержимого, «разбитом на части». Это используется, когда длина содержимого, запрошенного с веб-сервера, неизвестна на момент начала ответа. В основном он состоит из количества отправляемых байтов, за которым следует CRLF , за которым следуют байты. Об окончании ответа сигнализирует точная последовательность, которую вы видите. Теперь веб-сервер ожидает вашего следующего запроса (это также называется «конвейерной обработкой запросов»).

У вас есть несколько возможностей:

  • Использовать HTTP версии 1.0. Это приведет к тому, что веб-сервер автоматически закроет соединение, когда ответ будет полностью отправлен.
  • Укажите заголовок «Connection: close» при отправке вашего запроса. Это также закроет соединение.
  • Разберите кодировку содержимого, «разбитую по частям», и просто обработайте это так, как будто ответ теперь завершен, а это так.
8
ответ дан 18 December 2019 в 08:29
поделиться

Итак, вы читаете из сокета (вы не показываете, что в вашем коде, но это то, что я понял из текста)?

Пока другая сторона не закрывает соединение, Java не знает, что он находится в конце ввода, поэтому readLine () ожидает, пока другая сторона отправит дополнительные данные, и не возвращает null .

7
ответ дан 18 December 2019 в 08:29
поделиться

Попробуйте GET url HTTP / 1.0 . HTTP / 1.0 сообщает серверу, что вы не можете обрабатывать более одного документа за одно соединение. В этом случае,

4
ответ дан 18 December 2019 в 08:29
поделиться

Ваш HTTP-запрос неполно без двух пар «возврат каретки + перевод строки». Вероятно, вам также следует вызвать close после отправки запроса:

out.print("GET /index.html HTTP/1.0\r\n");
// maybe print optional headers here
// empty line
out.print("\r\n");
out.flush();
out.close();
0
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: