有的时候服务器生成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 ofDataOuputStream
calls theflush
method of its underlying output stream. -
-
Overrides:
-
flush
in classFilterOutputStream
-
-
-
Throws:
-
IOException
- if an I/O error occurs.
See Also:
-
FilterOutputStream.out
,OutputStream.flush()
-
一篇csdn上关于flush()方法的讨论
http://community.youkuaiyun.com/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()方法。