java HTP协议之HttpConnUtil
2016-03-31 10:48
387 查看
package com.catstudio.user.client.interstellar; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class HttpConnUtil { public static HttpURLConnection connect(String address) throws IOException { URL url = new URL(address); HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(); httpUrlConnection.setRequestMethod("POST"); httpUrlConnection.setDoOutput(true); httpUrlConnection.setDoInput(true); httpUrlConnection.connect(); return httpUrlConnection; } public static void close(InputStream din) { if (din != null) { try { din.close(); } catch (IOException e) { e.printStackTrace(); } din = null; } } public static void close(OutputStream dou) { if (dou != null) { try { dou.close(); } catch (IOException e) { e.printStackTrace(); } dou = null; } } public static void close(HttpURLConnection conn) { if (conn != null) { conn.disconnect(); conn = null; } } /** * 获取DataInputStream,当in 数据中没有数据,或者数据长度小于4个字节(无效请求)的时候返回null * * @param conn * @return */ public static DataInputStream getDataInputStream(InputStream in) { if (in == null) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); // 读取数据到缓冲流 try { while (true) { int b = in.read(); if (b == -1) { break; } dos.write(b); } } catch (IOException e) { e.printStackTrace(); } byte[] bytes = baos.toByteArray(); // 关闭暂时的流 HttpConnUtil.close(dos); HttpConnUtil.close(baos); // 无效数据长度 if (bytes.length < 4) { return null; } // 返回新的流 return new DataInputStream(new ByteArrayInputStream(bytes)); } /** * 获取DataInputStream,当in 数据中没有数据,或者数据长度小于4个字节(无效请求)的时候返回null * * @param conn * @return */ public static DataInputStream getGzipDataInputStream(InputStream in) { if (in == null) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); // 读取数据到缓冲流 try { while (true) { int b = in.read(); if (b == -1) { break; } dos.write(b); } } catch (IOException e) { e.printStackTrace(); } byte[] bytes = null; try { bytes = baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } // System.out.println("字节长度:" + bytes.length); // 关闭暂时的流 byte[] gbipByte = GZipUtil.uncompress(bytes); // System.out.println("解压后长度:" + gbipByte.length); HttpConnUtil.close(dos); HttpConnUtil.close(baos); // 无效数据长度 if (bytes.length < 4) { return null; } // 返回新的流 return new DataInputStream(new ByteArrayInputStream(gbipByte)); } }
在getDataInputStream方法中,之所以会重新write一遍,是为了防止数据流被截断。第二个有趣的地方是:ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos); 这样写之后,操作dos就会操作baos,因为他俩操作的是同一个数据流,持有的是同一个引用。相当于c++中传递指针那样,最后还是会对同一个对象进行操作。
相关文章推荐
- 批命令连接指定wifi 网络
- 【译】在ASP.Net和IIS中删除不必要的HTTP响应头
- Flash加载网络图片显示
- bzoj3597方伯伯运椰子
- Httpclient POST
- 安卓监听网络状态改变
- Apache搭建http协议版本库
- Runtime初涉之消息转发 http://www.cocoachina.com/ios/20151015/13769.html
- VirtualBox虚拟机网络设置
- 使用httpclient必须知道的参数设置及代码写法、存在的风险
- nginx使用ssl模块配置HTTPS支持
- 3月“.网络”域名总量十强:排名不变 万网降幅最大
- okHttp,greenDao,EventBus组合框架项目中实战
- Android网络通信框架LiteHttp2.0 开篇简介和大纲目录
- https处理
- 对Socket通信、TCP/IP和Http的理解
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附代码)
- HttpURLConnection中econnreset异常之后的理解
- Https加密认证保网站安全
- 计算机网络应用层和传输层及网络层协议有哪些?