поток висит в socketRead0 Java - PullRequest
1 голос
/ 05 января 2011

В основном я пытаюсь загрузить HTML-контент веб-страницы.Метод очень прост

        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        BufferReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
        String line;
        StringBuilder pageBuilder = new StringBuilder();
        while ((line = in.readLine()) != null) {
            pageBuilder.append(line + "\n");
        }

Но иногда программа просто зависает.Я попытался отладить, и трассировка стека потоков говорит мне, что он зависает при вызове метода SocketRead0.Я попытался установить readtimeout для соединения, но оно не работает.Любые идеи о том, как я могу обнаружить и пройти через блок SocketRead0?

Редактировать: Кажется, что у меня на самом деле проблема в том, что getReponseCode неявно вызывает некоторые методы getInputStream и некоторые read () и затем зависает в readSocket0).Могу ли я в любом случае убедиться, что вызов getReponseCode () будет безопасным?Вот трассировка стека одного потока: Уровень 0 - самый последний вызов

thread 24stacktrace
        At 0level
        at method socketRead0
        at line -2
        At 1level
        at method read
        at line 129
        At 2level
        at method fill
        at line 218
        At 3level
        at method read1
        at line 258
        At 4level
        at method read
        at line 317
        At 5level
        at method parseHTTPHeader
        at line 687
        At 6level
        at method parseHTTP
        at line 632
        At 7level
        at method getInputStream
        at line 1200
        At 8level
        at method getResponseCode
        at line 379
        At 9level
        at method pushFinalRedirectedURL
        at line 132
        At 10level
        at method process
        at line 134
        At 11level
        at method run
        at line 40

Ответы [ 4 ]

2 голосов
/ 05 июля 2011

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

Программное обеспечение все еще ожидает ответа сервера, но оно так и не приходит.

Чтобы избежать этого, вам нужно использовать метод setConnectTimeout(), поэтому, если сервер не отправит ответ в установленное время, соединение будет прервано.

ссылка setConnectTimeout ()

2 голосов
/ 05 января 2011

Вы должны убедиться, что в вашем буфере есть данные для чтения, прежде чем вызывать функцию readline.Как упоминал Питер, SocketRead - это блокирующая функция, которая означает, что при вызове она будет сидеть и ждать, пока данные будут помещены в поток. - это ссылка на API BufferedReader.

2 голосов
/ 05 января 2011

чтение сокета является блокирующей операцией.Он будет блокироваться до тех пор, пока не будет больше данных, не будет достигнут конец потока или не будет закрыто соединение.

1 голос
/ 12 мая 2011

Просто дополнение к предыдущим ответам о блокировке чтения сокетов: если метод private native int socketRead0(FileDescriptor fd, byte b[], int off, int len, int timeout) throws IOException получает тайм-аут 0 (по умолчанию), тайм-аут не используется. Следовательно, он может блокировать вместо создания IOException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...