<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://hezhou88.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>请教一个关于URLConnection向servlet发送文件的异常问题</title>
        <author>hezhou88</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hezhou88.javaeye.com">hezhou88</a>&nbsp;
          链接：<a href="http://hezhou88.javaeye.com/blog/186503" style="color:red;">http://hezhou88.javaeye.com/blog/186503</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我现在的项目有个功能是要在本地发送xml文件到servlet，这个过程是我主动请求的，servlet得到请求后接收到xml文件，然后把反馈信息（result.xml）发给我，我然后再接收这个result.xml文件，判断操作是否成功。<br />HttpURLConnecion&nbsp;&nbsp;connection = null；</p>
<p>/**<br />&nbsp; * 初始化<br />&nbsp; *<br />&nbsp; */<br />&nbsp;public void init(String urlString){<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if(urlString !=null)<br />&nbsp;&nbsp;&nbsp;&nbsp;url = new URL(urlString);<br />&nbsp;&nbsp;&nbsp;if(url !=null)<br />&nbsp;&nbsp;&nbsp;&nbsp;connection = (HttpURLConnection)url.openConnection();<br />&nbsp;&nbsp;&nbsp;connection.setDoOutput(true);<br />&nbsp;&nbsp;&nbsp;connection.setRequestProperty("Content-Type","multipart/form-data");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;} catch (MalformedURLException e) {<br />&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;} catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;}</p>
<p>public void sendData(String fileName,String filePath){<br />&nbsp;&nbsp;String urlPath = "<a href="http://ip:7001/pack/acceptServlet?username=sys&amp;password=sys">http://ip:7001/pack/acceptServlet?username=sys&amp;password=sys</a>";<br />&nbsp;&nbsp;init(urlPath);<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));//本地xml文件<br />&nbsp;&nbsp;&nbsp;DataOutputStream ps = new DataOutputStream(new DataOutputStream(connection.getOutputStream()));</p>
<p>&nbsp; &nbsp;int bufferSize = 8192;<br />&nbsp;&nbsp;&nbsp;byte[] buf = new byte[bufferSize];</p>
<p>&nbsp;while (true) {<br />&nbsp;&nbsp;&nbsp;&nbsp;int read = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (fis != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read = fis.read(buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if (read == -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;ps.write(buf, 0, read);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;ps.flush();<br />&nbsp;&nbsp;&nbsp;fis.close();<br />&nbsp;&nbsp;&nbsp;ps.close();<br />&nbsp;&nbsp;&nbsp;System.out.println("文件传输完成");<br />&nbsp;&nbsp;&nbsp;//开始接收Result文件</p>
<p>acceptResult("F:\\result.xml");<br />&nbsp;&nbsp;} catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>public void acceptResult(String path){<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;int passedlen = 0;<br />&nbsp;&nbsp;&nbsp;byte[] buf = new byte[8192];<br />&nbsp;&nbsp;&nbsp;DataInputStream inputStream = new DataInputStream(new BufferedInputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.getInputStream()));<br />&nbsp;&nbsp;&nbsp;DataOutputStream fileOut = new DataOutputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new BufferedOutputStream(new BufferedOutputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new FileOutputStream(path))));<br />&nbsp;&nbsp;&nbsp;while (true) {<br />&nbsp;&nbsp;&nbsp;&nbsp;int read = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (inputStream != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read = inputStream.read(buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;passedlen += read;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (read == -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;fileOut.write(buf, 0, read);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;System.out.println("保存完成");<br />&nbsp;&nbsp;&nbsp;fileOut.flush();<br />&nbsp;&nbsp;&nbsp;fileOut.close();<br />&nbsp;&nbsp;} catch (FileNotFoundException e) {<br />&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;} catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>以下是servlet代码：</p>
<p>public class AcceptTestServlet&nbsp; extends HttpServlet{<br />&nbsp;<br />&nbsp;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />//&nbsp;&nbsp; TODO 自动生成方法存根\<br />//&nbsp;&nbsp;File file = new File(path);<br />&nbsp;&nbsp;DataInputStream dis = new DataInputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;new BufferedInputStream(request.getInputStream()));<br />&nbsp;&nbsp;System.out.println("开始接收文件");<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;DataOutputStream fileOut = new DataOutputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;new BufferedOutputStream(new BufferedOutputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new FileOutputStream("F:\\projectInfo.xml"))));<br />&nbsp;&nbsp;int bufferSize = 8192;<br />&nbsp;&nbsp;byte[] buf = new byte[bufferSize];<br />&nbsp;&nbsp;while (true) {<br />&nbsp;&nbsp;&nbsp;int read = 0;<br />&nbsp;&nbsp;&nbsp;if (dis != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;read = dis.read(buf);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if (read == -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;fileOut.write(buf, 0, read);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;fileOut.flush();<br />&nbsp;&nbsp;dis.close();<br />&nbsp;&nbsp;fileOut.close();<br />&nbsp;&nbsp;System.out.println("文件接收完成");<br />&nbsp;&nbsp;<br />//&nbsp;&nbsp;开始返回结果文件<br />&nbsp;&nbsp;String path= "";<br />&nbsp;&nbsp;if(request.getParameter("isupdate") != null){<br />&nbsp;&nbsp;&nbsp;String isupdate = request.getParameter("isupdate");<br />&nbsp;&nbsp;&nbsp;if("sys".equalsIgnoreCase(username) &amp;&amp; "sys".equalsIgnoreCase(password) ){<br />&nbsp;&nbsp;&nbsp;&nbsp;path = "F:\\success_Result.xml";<br />&nbsp;&nbsp;&nbsp;}else<br />&nbsp;&nbsp;&nbsp;&nbsp;path = "F:\\fail_Result.xml";<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;System.out.println("path："+path);<br />&nbsp;&nbsp;System.out.println("开始返回结果文件");<br />&nbsp;&nbsp;DataInputStream fis = new DataInputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;new BufferedInputStream(new FileInputStream(path)));<br />&nbsp;&nbsp;OutputStream os = response.getOutputStream();<br />&nbsp;&nbsp;DataOutputStream dos = new DataOutputStream(os);<br />&nbsp;&nbsp;byte[] b = new byte[8192];<br />&nbsp;&nbsp;while (true) {<br />&nbsp;&nbsp;&nbsp;int read = 0;<br />&nbsp;&nbsp;&nbsp;if (fis != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;read = fis.read(b);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if(read == -1){<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;dos.write(b,0,read);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;dos.flush();<br />&nbsp;&nbsp;fis.close();<br />&nbsp;&nbsp;os.close();<br />&nbsp;&nbsp;dos.close();<br />&nbsp;&nbsp;System.out.println("返回结果文件完毕");<br />&nbsp;}<br />&nbsp;<br />&nbsp;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO 自动生成方法存根<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doGet(request,response);<br />&nbsp;&nbsp; }</p>
<p>}<br /><br />当我执行到acceptResult方法中的DataInputStream inputStream = new DataInputStream(new BufferedInputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.getInputStream()))时，就报了一个异常：java.net.SocketException: Software caused connection abort: recv failed；并且AcceptTestServlet&nbsp; 还没有执行，因为只有当connection.getInputStream()执行的时候，AcceptTestServlet&nbsp; 才会有响应；</p>
<p>我当时想，是不是要重新连接一次才行，后来重新open了一次后就没报错了，但是AcceptTestServlet&nbsp; 却不能收到文件；因为这是两个不同的连接，servlet当然读不到这个流</p>
<p>所以说，必须还是得在同一个连接下才行，关键就是这个异常，不知道是什么意思，真是郁闷死我了。有哪位高人做过这方面的东西，能否指点一二呢？</p>
          <br/>
          <span style="color:red;">
            <a href="http://hezhou88.javaeye.com/blog/186503#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Apr 2008 19:41:39 +0800</pubDate>
        <link>http://hezhou88.javaeye.com/blog/186503</link>
        <guid>http://hezhou88.javaeye.com/blog/186503</guid>
      </item>
  </channel>
</rss>