Сокеты java - получение пустого буфера

Я получаю странные результаты чтения InputStream из Socket. Когда я отправляю данные из своей программы, я получаю действительный результат ОДИН РАЗ. Когда я делаю это из отдельной программы, я получаю достоверные данные, но сервер продолжает читать то же сообщение, даже если я ничего не отправляю, просто подключившись к сокету, я получаю пустой массив.

in = socket.getInputStream();
out = socket.getOutputStream();
dIn = new DataInputStream(in);

while(this.isAlive()) {
        try {
            dIn.read(buffer);

            StringBuilder builder = new StringBuilder();

            for(int i = 0; i < buffer.length; i++) {
                builder.append(buffer[i]).append(" ");
            }

            builder.append("\n");

            System.out.println(builder.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Выход (просто подключение к розетке):

0 0 0 0 0 0 0 0 

Ваш код содержит по крайней мере одно важное но (которое может вызвать всевозможные проблемы), но вы обязательно должны прочитать минимальный воспроизводимый пример и улучшить свой вопрос. Например: откуда этот массив буфер?

GhostCat 13.09.2018 20:54

Я ценю быстрое принятие!

GhostCat 13.09.2018 21:11
1
2
194
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Цитата из javadoc для читать():

Returns:

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.

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

Другими словами: всегда всегда всегда, когда вы вызываете какой-либо метод read(), который возвращает такое значение, ваш код абсолютно должен проверять результат, чтобы гарантировать, что (ожидаемые) данные действительно были получены при чтении.

Скорее всего, это часть вашей проблемы. Но чтобы быть уверенным, вам нужно будет дополнить свой вопрос дополнительной информацией.

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

GPlayer 13.09.2018 21:10

Другие вопросы по теме