программа зависает внутри цикла while для чтения входного потока из сокета: Java

1

У меня есть следующий код для чтения входного потока из соединения сокета:

private ByteBuffer toByteBuffer(BufferedInputStream is) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int l;
    byte[] data = new byte[256];
    while ((l = is.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, l);
    }
    buffer.flush();
    return ByteBuffer.wrap(buffer.toByteArray());
}

В первой итерации цикла while все идет хорошо, и я могу получить данные в буфер. Но тогда он застревает во while ((l = is.read(data, 0, data.length)) != -1) {

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

Как я могу справиться с этой ситуацией/повесить?

Теги:
sockets
inputstream
hang

1 ответ

3
Лучший ответ

Поскольку метод BufferedInputStream который вы используете, не блокирует вас, вы получаете такую ситуацию, что, как только ваш InputStream не будет иметь никаких данных и не будет закрыт, вы не получите -1, а 0. Это отправит ваш метод в бесконечный петля.

Поэтому для чтения локальных потоков лучше проверить read() <= 0 поскольку вы обычно получаете данные достаточно быстро.
Лучший способ - убедиться, что есть eof, закрывающий поток.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню