Проблема при преобразовании InputStream в String - PullRequest
2 голосов
/ 12 октября 2010

Я создал Java-программу, которая действует как Rest Web Server. Он получает запрос http и отправляет ответ. Я получаю запрос http в качестве входного потока внутри моего сервера. Я хочу преобразовать этот поток ввода в строку и затем проанализировать строку в соответствии с каким-то предопределенным шаблоном. Проблема в том, что когда я получаю входной поток и пытаюсь преобразовать его в строку, он не завершит операцию, пока не поступит новый запрос или исходный запрос не будет завершен. Если какое-либо из этих двух событий происходит только тогда, входной поток успешно преобразуется в строку, в противном случае он просто повешается там. Я что-то пропустил? Любые предложения будут очень полезны.

  ServerSocket service = new ServerSocket(Integer.parseInt(argv[0]));
  Socket connection = service.accept();

                InputStream is = connection.getInputStream();
                String ss = IOUtils.toString(is);
                System.out.println("PRINT : "+ss);

Теперь ss печатается только когда старый запрос завершен или новый запрос принят в сокет. Я хочу преобразовать его в строку в том же запросе.

Подскажите, пожалуйста, что я делаю не так?

Спасибо, Тара Сингх

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Вы должны прочитать запрос по шагам.Сначала прочитайте заголовки, строка за строкой.Затем, если это запрос POST, будет тело запроса.Если это так, вы должны были прочитать заголовок Content-Length, который говорит, как долго тело находится в байтах.Вы должны прочитать это количество байтов из входного потока.

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

0 голосов
/ 12 октября 2010

То, что вы делаете неправильно, заключается в том, что вы хотите преобразовать поток в строку - операция, которая возможна только после завершения потока. Вот почему вы получаете свою строку, когда соединение разорвано. Как еще метод toString должен знать, когда больше нет данных, и он должен начать преобразование? Что если он выплевывает строку и тем временем в поток поступает больше данных? Я думаю, ты тоже не будешь счастлив :)

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

...