关闭

http Chunked

3730人阅读 评论(0) 收藏 举报

有的时候服务器生成HTTP回应是无法确定信息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,这时服务器一般采用Chunked编码。

在进行Chunked编码传输时,在回复消息的头部有transfer-coding并定义为Chunked,表示将用Chunked编码传输内容。

在jsmartsales中,在midlet向服务端以POST方式发送Request时,发现是以Chunked方式编码的(我的服务端不支持Chunked编码);

在去掉dos.flush();后,就不是以Chunked方式编码的了,程序正常,servlet端可以以Request.getParameter()方法取到参数了

为什么呢?

先看DataOutputStream类的javadoc

flush

public void flush()
           throws IOException
Flushes this data output stream. This forces any buffered output bytes to be written out to the stream.

The flush method of DataOuputStream calls the flush method of its underlying output stream.

 

Overrides:
flush in class FilterOutputStream
Throws:
IOException - if an I/O error occurs.
See Also:
FilterOutputStream.out, OutputStream.flush()

一篇csdn上关于flush()方法的讨论

http://community.csdn.net/Expert/topic/4800/4800968.xml?temp=.1741144

flush方法即使在缓冲区中没有满的情况下,也会将缓冲区内的内容强制写到外设,也就是所谓的刷新。flush方法不是对所有的OutputStream子类起作用,只对那些使用缓冲区的OutputStream子类有效。。。。
调用close方法,系统在关闭这个流前,也会将缓冲区的内容写到外设上。。。。
所以你在程序中要注意对flush的调用,不然可能碰到奇怪的问题。。。

这篇文章:http://www.zdnet.com.cn/developer/code/story/0,3800066897,39381759-2,00.htm说的很清楚

dos.flush(); //包含本句,在某些设被上将可能会产生不可预期的结果

调用flush ()方法的意图是发送已经写入的数据到DataOutputStream的服务器的缓冲区中。在某些电话上,这个操作工作正常,在其他的电话上,它导致HTTP请求的Transfer - Encoding被设置为" chunked ",有一些随机字符被放到请求本身的前面和后面。那又怎样处理这个问题呢?这个方法调用实际上是根本不需要的。在接下来的一行中,服务器连接打开(通过openInputStream ()),将自动输入缓冲区。因此,你最好不要调用缓冲区的flush()方法。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:107526次
    • 积分:1649
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:14篇
    • 译文:1篇
    • 评论:10条
    文章分类
    最新评论
    open source
    常去的论坛