Java 您认为http协议混合字符流和字节流不是一个好的设计吗

Java 您认为http协议混合字符流和字节流不是一个好的设计吗,java,http,protocols,implementation,Java,Http,Protocols,Implementation,首先,当我说http协议混合字符流和字节流时,我的意思是请求头是字符流,请求体是字节流(由内容长度指定),它们用空行分隔 这种设计使http实现更加困难。例如,如果使用java实现http服务器,则不能使用此类代码,因为BufferedReader将为读取行缓冲一些字节 InputStream stream=socket.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(strea

首先,当我说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协议使用请求头指定长度的前两个字节,而不是使用空行,那么实现http协议将更加容易。

这不仅仅是糟糕的设计。。。它坏了。很可能
BufferedReader
会将请求正文的第一部分读入其缓冲区。因此,当您在最后从流中读取时,您将无法获得全部正文

一旦你包装了一个
InputStream
,你就不应该直接使用它。。。特别是当包装器进行缓冲时


实现这一点的最佳方法是使用现有的HTTP服务器端实现。Apache HTTP组件库是一个很好的选择。

如果您必须自己实施,那么简单的解决方案是:

  • InputStream
    包装在
    BufferedInputStream
  • 使用
    BufferedInputStream
    一次读取一个字节的标题行,然后构建行并自己转换为字符串
  • 使用
    BufferedInputStream
    读取正文

  • 我觉得HTTP协议的愚蠢设计使得
    java.io
    库毫无用处

    我不会那么说。问题在于HTTP协议可能要求客户端在消息的中途切换其解释请求或响应消息的字符/字节的方式。但如果你仔细想想,这并不是一件不合理的事情。备选方案是:

    • 发送会增加协议开销的单独消息,或
    • 将请求/响应行和头编码并发送为字节,而不是字符

    我们真正拥有的是一个复杂的用例,它太不寻常了,在通用
    java.io
    库中不受支持。协议支持库将处理此问题。。。如果你能使用一个。

    这不仅仅是糟糕的设计。。。它坏了。很可能
    BufferedReader
    会将请求正文的第一部分读入其缓冲区。因此,当您在最后从流中读取时,您将无法获得全部正文

    一旦你包装了一个
    InputStream
    ,你就不应该直接使用它。。。特别是当包装器进行缓冲时


    实现这一点的最佳方法是使用现有的HTTP服务器端实现。Apache HTTP组件库是一个很好的选择。

    如果您必须自己实施,那么简单的解决方案是:

  • InputStream
    包装在
    BufferedInputStream
  • 使用
    BufferedInputStream
    一次读取一个字节的标题行,然后构建行并自己转换为字符串
  • 使用
    BufferedInputStream
    读取正文

  • 我觉得HTTP协议的愚蠢设计使得
    java.io
    库毫无用处

    我不会那么说。问题在于HTTP协议可能要求客户端在消息的中途切换其解释请求或响应消息的字符/字节的方式。但如果你仔细想想,这并不是一件不合理的事情。备选方案是:

    • 发送会增加协议开销的单独消息,或
    • 将请求/响应行和头编码并发送为字节,而不是字符

    我们真正拥有的是一个复杂的用例,它太不寻常了,在通用
    java.io
    库中不受支持。协议支持库将处理此问题。。。如果您能够使用一个。

    是的,但也会更容易生成断开的消息。

    是的,但是生成断开的消息也会更容易。

    谢谢你的回答。我的作业是实现一个没有第三方库的简单http服务器。我觉得http协议的愚蠢设计使java.io库变得无用。谢谢你的回答。我的作业是实现一个没有第三方库的简单http服务器。我觉得http协议愚蠢的设计使java.io库变得无用。谢谢你的回答。但你是说当前的设计更容易产生单独(断开)的消息,还是说使用请求头指定长度的前两个字节更容易产生坏(断开)的消息消息。感谢您的回答。但您的意思是,当前的设计更容易生成单独的(断开的)消息,还是使用请求头的前两个字节指定长度更容易生成错误的(断开的)消息。断开的不是协议。如果您真的觉得有必要实现自己的HTTP库,那么可以利用这样一个事实,即头的每个字符都是ASCIIIt,而不是被破坏的协议。如果您确实觉得有必要实现自己的HTTP库,请利用头的每个字符都是ASCII这一事实