项目总结-HttpURLConnection的disconnect的问题

原创 2014年11月18日 17:04:05

        项目需要存储文件,但是由于使用百度云平台的服务器,没有文件写权限,辗转使用中间转发的策略,将文件存储在公司公网服务器上,通过云平台的文件请求都转发到文件服务器。响应转发过程中,总是得不到转发的响应内容。跟踪发现获取到的URLConnection的输入流的available总是返回0,导致转发响应内容为空。调试发现把 URLConnection的disconnect()调用代码注释掉,能够转发成功。

/**
	 * 以http方式发送请求,并将请求响应内容以String格式返回
	 * @param path    请求路径
	 * @param method  请求方法
	 * @param body    请求数据
	 * @return 返回响应的字符串
	 */
	public static void httpRequestRediret(HttpServletResponse response,String fileName,String path, String method, String body) {
		HttpURLConnection conn = null;
		InputStream inputStream = null;
		try {
			URL url = new URL(path);
			conn = (HttpURLConnection) url.openConnection();
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			conn.setRequestMethod(method);
			if (null != body) {
				OutputStream outputStream = conn.getOutputStream();
				outputStream.write(body.getBytes("UTF-8"));
				outputStream.close();
			}
			
			//代理返回流信息
			inputStream = conn.getInputStream();
			response.setContentType(conn.getContentType());
			FileUtil.responseAttachment(fileName,inputStream, response);
		} catch (Exception e) {
			logger.error(e);
		}finally{
			if(conn!=null){
				conn.disconnect();
			}
		}
	}

FileUtil转发附件

/**
	 * Http响应内容为附件
	 * @param file
	 * @param response
	 */
	public static void responseAttachment(String fileName ,InputStream in,HttpServletResponse response){
		if(response==null||in==null||fileName==null){
			return;
		}
		
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		byte[] buff = new byte[1024];
		int bytesRead;
		
		try{
			response.setHeader("Content-disposition", "attachment; filename="
					+ new String(fileName.getBytes("utf-8"), "ISO8859-1"));
			response.setHeader("Content-Length", String.valueOf(in.available()));
			bis = new BufferedInputStream(in);
			bos = new BufferedOutputStream(response.getOutputStream());
			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
				bos.write(buff, 0, bytesRead);
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(bis!=null){
				try {
					bos.close();
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		
		}
	}

             结论:URLConnection的响应流InputStream在没有处理之前就关闭connection会导致该输入流信息为空,getInputStream()的available总是为0。猜测disconnection可能执行了输入流的关闭操作了。response响应头如果不设置Content-Length,客户端也能正确获取到响应文件的。网上看到一种说法说如果将输入流关闭后,则对应的URLConnection也会自动关闭了。还有一个问题是如果Connection没有执行disconnect()操作,会有什么后果呢?

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

详解HttpURLConnection

请求响应流程设置连接参数的方法setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultA...
  • woxueliuyun
  • woxueliuyun
  • 2015年01月29日 10:21
  • 99988

使用HttpURLConnection时遇到的资源未释放的问题

http://blog.sina.com.cn/s/blog_56beadc60100j9zu.html 今天自己写了一个压力测试的小程序,同时启100个线程,每个线程都串行地访问应用服务器...
  • victoryckl
  • victoryckl
  • 2013年04月14日 12:11
  • 2943

HttpURLConnection

HttpURLConnection继承自URLConnection,另一个直接子类为 HttpsURLConnectionHTTP (RFC 2616) 的 URLConnection 用来发送和接收...
  • u013750453
  • u013750453
  • 2015年04月24日 00:15
  • 1445

详解HttpURLConnection(注意末尾的部分)

请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachesset...
  • caomiao2006
  • caomiao2006
  • 2016年09月24日 10:56
  • 1070

HttpURLConnection的关闭链接写在finally里防止报错不关闭占用资源

HttpURLConnection的关闭链接写在finally里,防止报错不关闭占用资源
  • Little_Matches
  • Little_Matches
  • 2016年12月30日 17:04
  • 4852

Java爬虫到一些总结和心得

最近做了很多关于爬虫到项目,写点感想,以后查询 1.请求http连接,并保存内容,catch不同到exception进行反爬处理 int countUrl=0;              pu...
  • leaderway
  • leaderway
  • 2016年08月22日 01:02
  • 2026

HttpURLConnetion的使用

HttpURLConnection是用来发送Http请求的类,用法如下: String urlStr = "http://www.xx.com"; URL url = new...
  • Julyraining
  • Julyraining
  • 2016年01月28日 23:04
  • 982

HttpClient 异常出现不关闭引发的血案

最近在处理百度知道接口的问题时,遇到了下面的问题。在本机测试一直没有问题,因为测试的时间太短。而放到服务器上面就出现了下面的异常。而且是一直的出现。google 一下,原来是http连接出现了异常没有...
  • JavaAlpha
  • JavaAlpha
  • 2011年01月23日 08:57
  • 17394

URLConnection的连接、超时、关闭用法总结

URLConnection的连接、超时、关闭用法总结 java中可以使用HttpURLConnection来请求WEB资源。 1:> URL请求的类别: 分为二类,GET与POST请求。二者...
  • yzx41099296
  • yzx41099296
  • 2012年11月10日 00:23
  • 12155

HttpURLConnection, HttpClient机制分析

HttpClient httpClient.execute(Method) 直接发送请求并读取响应,而 method.getResponseBody 其实只是从response缓存中...
  • wangshfa
  • wangshfa
  • 2013年08月06日 08:38
  • 6985
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:项目总结-HttpURLConnection的disconnect的问题
举报原因:
原因补充:

(最多只允许输入30个字)