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+lua[2]](/uploads/allimg/131030/110J64609-0-lp.jpg)








