HttpURLConnection用法详解(3)

来源:未知 责任编辑:责任编辑 发表时间:2013-11-18 20:56 点击:

p>    java.net.ProtocolException: Cannot write output after reading input....... 

p>       

p>       c:) http请求实际上由两部分组成, 

p>    一个是http头,所有关于此次http请求的配置都在http头里面定义, 

p>           一个是正文content。 

p>    connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前, 

p>    就必须把所有的配置准备好。 

p>       d:) 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的, 

p>    实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络, 

p>    而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。 

p>    至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求 

p>    正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http 

p>    请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数 

p>    之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改) 

p>    都是没有意义的了,执行这些操作会导致异常的发生。 

p> 

p>6:> Servlet端的开发注意点: 

p>a:) 对于客户端发送的POST类型的HTTP请求,Servlet必须实现doPost方法,而不能用doGet方法。 

p>b:) 用HttpServletRequest的getInputStream()方法取得InputStream的对象,比如: 

p>     InputStream inStream = httpRequest.getInputStream(); 

p>     现在调用inStream.available()(该方法用于“返回此输入流下一个方法调用可以不受阻塞地 

p>     从此输入流读取(或跳过)的估计字节数”)时,永远都反回0。试图使用此方法的返回值分配缓冲区, 

p>     以保存此流所有数据的做法是不正确的。那么,现在的解决办法是 

p>     Servlet这一端用如下实现: 

p>     InputStream inStream = httpRequest.getInputStream(); 

p>     ObjectInputStream objInStream = new ObjectInputStream(inStream); 

p>     Object obj = objInStream.readObject(); 

p>     // 做后续的处理 

p>     // 。。。。。。 

p>     // 。。。 。。。 

p>     而客户端,无论是否发送实际数据都要写入一个对象(那怕这个对象不用),如: 

p>     ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); 

p>     objOutputStrm.writeObject(new String("")); // 这里发送一个空数据 

p>     // 甚至可以发一个null对象,服务端取到后再做判断处理。 

p>     objOutputStrm.writeObject(null); 

p>     objOutputStrm.flush(); 

p>     objOutputStrm.close(); 
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1