Как вы думаете, протокол HTTP смешивать поток символов с потоком байтов не очень хороший дизайн - PullRequest
1 голос
/ 25 сентября 2011

Во-первых, когда я говорю протокол HTTP смешивание потока символов с потоком байтов, я имею в виду заголовок запроса является потоком символов и тело запроса является потоком байтов (указанопо длине содержимого) они разделяются пустой строкой.

Эта конструкция усложняет реализацию http. Например, если вы используете Java для реализации http-сервера, вы не можете использовать такой код, потому что BufferedReader буферизует несколько байтов для чтения строки.

InputStream   stream=socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
String line;
while( !(line=reader.readLine()).equals("") ){
    //do something with line
}
//from stream to read content-length bytes
stream.read(...)

Было бы проще реализовать протокол http, если бы он использовал первые два байта до указанной длины заголовка запроса вместо использования пустой строки.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Это не просто плохой дизайн ... он сломан.Скорее всего, BufferedReader прочитает первую часть тела запроса в свой буфер.Поэтому, когда вы читаете из потока в конце, вы не получите все тело.

После того, как вы завернули InputStream, вы не должны использовать его напрямую ... особенно если обертка делаетbuffering.


Лучший способ реализовать это - использовать существующую реализацию на стороне HTTP-сервера.Библиотека Apache HTTP Components - хорошая альтернатива для рассмотрения.

Если вам нужно реализовать это самостоятельно, тогда простое решение:

  1. Оберните InputStream в BufferedInputStream.
  2. Используйте BufferedInputStream для чтения строк заголовка по байтам за раз, построения строк и преобразования себя в строку.
  3. Используйте BufferedInputStream для чтенияbody.

Мне кажется, что глупый дизайн протокола HTTP делает библиотеку java.io бесполезной.

Я бы так не сказал.Проблема заключается в том, что протокол HTTP потенциально требует от клиента переключения способа интерпретации символов / байтов запроса или ответного сообщения в середине сообщения.Но если вы думаете об этом, это не является необоснованным.Альтернативы могут быть:

  • для отправки отдельных сообщений, которые увеличат издержки протокола, или
  • для кодирования и отправки строки запроса / ответа и заголовков в виде байтов, а не символов.

На самом деле у нас есть хитрый вариант использования, который слишком необычен, чтобы его можно было поддерживать в универсальных java.io библиотеках.Об этом позаботится библиотека поддержки протокола ... если бы вы могли ее использовать.

0 голосов
/ 25 сентября 2011

Да, но также было бы легче создавать неработающие сообщения.

...