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();
                    }
 

测试发现,无论模拟器还是实机,调用flush后服务器完全无法获取参数,不用flush则正常,后来在网上找到不用flush的原因:

 

在servlet端使用request.getContentLength();语句得不到数据长度的问题

原因主要是flush()语句的使用问题,flush方法即使在缓冲区中没有满的情况下,也会将缓冲区内的内容强制写到外设,也就是所谓的刷新。flush方法不是对所有的OutputStream子类起作用,只对那些使用缓冲区的OutputStream子类有效。。。。,因此在使用flush()方法时,发出的数据包就无法确定长度,这时底层自动使用chunked编码,就不会有"Content-Length"这个头域,因此在服务器端就没法获取长度。所以你在程序中要注意对flush的调用,不然可能碰到奇怪的问题。。。

 

其实调用close方法,系统在关闭这个流前,也会将缓冲区的内容写到外设上,所以一般必须使用close()方法就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值