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();
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>