В качестве задачи я реализовал базовый веб-сервер на Java.Когда я открываю raw InputStream
, я немедленно захожу в блокирующее чтение, которое считывает все 400 или байты HTTP-запроса в байтовый массив.Это работает, однако я не проверяю больше данных и просто закрываю сокет после отправки ответа.
Мне интересно, есть ли более надежный способ сделать это, чтобы не пропустить какие-либо данные изклиент.Я думал о чтении одного байта за раз, пока read
не вернул конец потока.Однако вместо этого иногда блокируется, когда данных больше нет, и в JavaDocs для public abtract int InputStream.read()
говорится:
If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
Таким образом, это означает, что две вещи могут произойти, если конец потокаДостигнут: возврат -1 и блокировка.Я вижу блокировку.
Мой вопрос, с протоколом, таким как HTTP, как вы должны читать из сокета и как вы узнаете, когда это все данные, которые вы будете получать в этом соединении?