j2me中post数据时,使用flush方法导致服务器接收数据错误
参考J2MP如何Post数据在网上可以搜到不少例子,代码虽然有一些差别,但是一般都是可以用的,其中搜索的个别帖子提到了写入提交数据后必须用flush,代码如下:
if(!postData.equals("")){ System.out.println(postData); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty( "Content-Length",String.valueOf(postData.length())); DataOutputStream dos = conn.openDataOutputStream(); dos.write(postData.getBytes("UTF-8")); dos.flush(); dos.close(); } if(!postData.equals("")){ System.out.println(postData); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty( "Content-Length",String.valueOf(postData.length())); DataOutputStream dos = conn.openDataOutputStream(); dos.write(postData.getBytes("UTF-8")); dos.flush(); dos.close(); }
测试发现,无论模拟器还是实机,调用flush后服务器完全无法获取参数,不用flush则正常,后来在网上找到不用flush的原因:
在servlet端使用request.getContentLength();语句得不到数据长度的问题
原因主要是flush()语句的使用问题,flush方法即使在缓冲区中没有满的情况下,也会将缓冲区内的内容强制写到外设,也就是所谓的刷新。 flush方法不是对所有的OutputStream子类起作用,只对那些使用缓冲区的OutputStream子类有效。。。。,因此在使用 flush()方法时,发出的数据包就无法确定长度,这时底层自动使用chunked编码,就不会有"Content-Length"这个头域,因此在服务器端就没法获取长度。所以你在程序中要注意对flush的调用,不然可能碰到奇怪的问题。。。
其实调用close方法,系统在关闭这个流前,也会将缓冲区的内容写到外设上,所以一般必须使用close()方法就行。
wtk文档给的post例子也用了flush,但并没说明情况,看来文档只是参考用的。
页:
[1]