Java HTTP GET ответ ожидает до истечения времени ожидания - PullRequest
1 голос
/ 16 декабря 2011

Я должен разработать программу, которая читает веб-страницу с указанным URL, но проблема в том, что мне не разрешено использовать какие-либо HTTP-библиотеки, мне разрешено использовать только TCP.

Нижекод, который читает ответное сообщение:

private static String readMultiline (BufferedReader inStr) {
    String message="";
    String line=readLine(inStr);

    while (line != null) {
         message += line + "\r\n";
         line=readLine(inStr);
    }

    if (message.length() == 0) return null;
        return message;
}

private static String readLine (BufferedReader inStr) {
    String line = null;
    try{
         line = inStr.readLine();
    } catch (IOException ioe) {
         System.out.println("ERROR: Incoming packet could not be read properly.");
         return null;
    }
    return line;
}

Проблема в том, что заголовок и содержимое веб-страницы полностью получены, но цикл while все еще ожидает «следующую» строку, которая не существует,Через некоторое время происходит тайм-аут и код продолжается.Сервер, к которому я пытаюсь подключиться, не выполняет «Соединение: закрыть».Как я могу определить конец файла?

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

Другие ответы были удалены, поэтому я опубликую их.Вы используете метод ввода-вывода, который читает строки информации, причем строка определяется как набор символов, оканчивающийся символом новой строки.Но нет никакой гарантии, что ваши TCP-пакеты заканчиваются символом новой строки, поэтому вам нужно использовать более независимое чтение ввода-вывода для их обработки.

Взгляните на DataInputStream, у него есть удобный метод под названием readFully, которыйЯ думаю, вы найдете весьма полезным.

0 голосов
/ 31 января 2012

извините за поздний ответ.

Для тех, кто мог столкнуться с той же проблемой, я также забыл добавить строку «Соединение: закрыть» к самому запросу . Когда я его добавил, проблема тайм-аута исчезла. С помощью этой функции и функций read () / readFully () мне удалось решить проблему. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 16 декабря 2011

читать по протоколу HTTP. ищите информацию о длине.

...