项目总结-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时遇到的资源未释放的问题

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

详解HttpURLConnection

请求响应流程设置连接参数的方法setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultA...

HttpURLConnection

HttpURLConnection继承自URLConnection,另一个直接子类为 HttpsURLConnectionHTTP (RFC 2616) 的 URLConnection 用来发送和接收...

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

请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachesset...

再探网络连接--HttpURLConnection

首先,HttpURLConnection应该算是HttpClient的替换者,度娘说HttpClient是对于HttpURLConnection的封装,这里由于不能拜读源码,所以没有办法验证,但是Ht...

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

URLConnection的连接、超时、关闭用法总结 java中可以使用HttpURLConnection来请求WEB资源。 1:> URL请求的类别: 分为二类,GET与POST请求。二者...

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

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

关于HttpURLConnection需要注意的几点

1.两种方式发送请求 get post get方式  参数放在url后面

HttpURLConnection中connect()方法是否要显示调用及openConnection()方法源码探究

描述:此问题是小编在学习Android项目网络知识时遇到的问题及心得, 部分内容说的是Java项目中的HttpURLConnection源码及实现原理,不过本质是相同的。小编语言组织不是太好加上对博...

使用Fiddler监听Java HttpURLConnection请求的小技巧

默认情况下Fiddler是不能监听Java HttpURLConnection上的HTTP请求的。原因容易理解,Fiddler能监听浏览器的HTTP请求是因为它启动一个代理服务器,浏览器通过这个代理服...
  • cslie
  • cslie
  • 2015年09月17日 16:24
  • 1191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:项目总结-HttpURLConnection的disconnect的问题
举报原因:
原因补充:

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