Я пытаюсь прочитать HTTP-запрос от Bufferedreader, который получает Socket.getInputStream()
в качестве входных данных. Однако, когда я использую Bufferedreader.lines().foreach()
, он никогда не завершается и просто застревает.
Мой код (упрощенно):
Socket socket = new ServerSocket(9090);
Socket newConnection = socket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(newConnection.getInputStream()));
reader.lines().forEach(s -> System.out.println(s));
2 ответа
Вам необходимо узнать больше о протоколе HTTP 1.1. Запросы не завершаются концом потока. Они завершаются исчерпанием счетчика байтов в заголовке Content-length или кумулятивных фрагментов, если используется режим фрагментированной передачи. Если они будут исчерпаны к концу потока, вы никогда не сможете отправить ответ.
Content-length
. Может просто иметь пустой контент. Поскольку код из вопроса, кажется, читает запрос header, стоит отметить, что заголовок заканчивается первой пустой строкой. И этот HTTP/1.1
позволяет отправлять несколько запросов через одно соединение.
Socket.shutdownOutput
. Вы, вероятно, путаете с обычным закрытием сокета, которое закрывает оба сразу
Попробуйте создать свой сокет с конструктором без параметров и используйте connect () с параметром порта и тайм-аута. Это предотвратит бесконечное замораживание.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.