如何设置iphone6s设置铃声教程铃声设置

Android的网络请求中GZip的使用
刚才去&&逛了逛,看到有一篇文章《》讲解了iOS上在HTTP请求中如何使用GZip,所以也有了冲动写一下Android的HTTP请求中GZip的使用。
闲话少说,还是先来看一下为什么要使用GZip吧,HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来减少文件大小,减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。
1、那如何在HTTP请求中使用GZip呢?
一般来说,在HTTP连接中,并不是所有的接收者都支持GZip格式的,所以根据HTTP协议,如果你可以处理GZip格式,并且希望服务器以GZip的格式来返回内容,需要在HTTP的请求的Header中声明"Accept-Encoding"为"gzip",如果服务器可以将内容压缩为GZip格式,那么服务器返回的Response的Header中将会设置"Content-Encoding"
属性的值是gzip,同时将返回的内容压缩为GZip格式。
2、在Android代码中如何实现GZip呢?
首先要在Http请求中加入支持GZip格式的声明,不同HTTP连接对象的设置方式也不相同,我们以HttpGet来举例:
httpRequest =&newHttpGet(url);
httpRequest.addHeader("Accept-Encoding",&"gzip");&
接收到服务器的返回时,要根据Response的Header中"Content-Encoding"
的值来绝定是否需要解压GZip内容,Android的SDK中内置了GZIPInputStream可以帮助我们解压GZip流得到一个正常的输入流。
HttpEntity httpEntity = httpResponse.getEntity();
InputStream&is=
httpEntity.getContent();
(httpEntity.getContentEncoding().getValue().contains("gzip"))
& is=&new&GZIPInputStream(is);
OK,这样就可以实现了,简单吧,大家觉得有什么不对劲了吗?这么好用的一项功能难道这么简单就可以实现?没错,如果不是在天朝写成如此就已经可以了,但是在天朝,我们当然不会这么省心。
在我国移动运营商“创新性”地弄了一种名叫“WAP”的网络,在常规的状况下WAP网络下只能访问WAP的内网,这就是使用WAP接入点时所有国外的应用都无法使用的原因。WAP网络为我们带来了两个难题:1是如何在WAP网络中访问外网,2是WAP网络的路由器会对流经的数据进行处理,很奇怪对不对,就好像是我们往来的信件会被人偷看,不仅仅是偷看,它还会做修改呢,很多的HTTP请求中的Header会被过滤掉,gzip的头也在其中,路由器过滤掉gzip标示的同时会把内容解压,这样我们的gzip就不起作用了。
怎样可以绕过那些路由器的过滤呢?比较简单的一个方法是服务器的返回不遵守HTTP协议,内容使用GZip压缩,但是不返回Content-Encoding=gzip,这样路由器就没有办法了。
如果这样我们的程序也要进行一定的修改,因为不能判断Content-Encoding来解压GZip了。我们可以输入流读取前两个字节,如果是0x8B1F,就认为是GZip格式。但是InputStream读过一次流就无法使用了,虽然它有reset方法,但是不知为何不起作用。经过试验我们选择了使用BufferedInputStream来中转,因为它可以通过reset来重新定位到流的开头。
BufferedInputStream bis =&new&BufferedInputStream(is);
bis.mark(2);
// 取前两个字节
byte[] header =&new&byte[2];
int&result = bis.read(header);
// reset输入流到开始位置
bis.reset();
// 判断是否是GZIP格式
if(result!=-1 && getShort(header, 0)==0x8b1f) {
& is=&new&GZIPInputStream(bis);
& // 取前两个字节
至于如何绕过WAP的限制访问外网,请继续关注Android IT,我们会在后面做讲解。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。http请求解压,解压步骤 - 互联网当前位置:& &&&http请求解压,解压步骤http请求解压,解压步骤&&网友分享于:&&浏览:0次http请求解压,解压方法
public static String analyzeGetGzip(String url,String param) throws Exception{
String result = "";
BufferedReader in =
String urlNameString = url + "?" +
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("Pragma", "no-cache");
connection.setConnectTimeout(5000);
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map&String, List&String&& map = connection.getHeaderFields();
InputStream urlStream = new GZIPInputStream(connection.getInputStream());
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(urlStream));
while ((line = in.readLine()) != null) {
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
} catch (Exception e2) {
e2.printStackTrace();
压缩方法:
public static void responseXmlWithGzip(HttpServletResponse response, String docXML){
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(bout);
gzip.write(docXML.getBytes("UTF-8"));
gzip.flush();
gzip.close();
byte[] buf = bout.toByteArray();
//服务器传回数据的类型和长度
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Encoding","gzip");
response.setHeader("Content_Length",buf.length+"");
response.getOutputStream().write(buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有9442人阅读
协议分析(3)
08年在csdn上面写了一个帖子关于解压http的gzip内容的,一直以来有不少的程序员前仆后继,持续的遇到同样的问题,正如我08年遇到的时候看的都是03 04年的帖子一样,现在把论坛上面的资料整理一下放到这里,希望能这个问题不会再困扰其他的程序员。
------------------------------
寻找gzip 获取一个网页数据返回的编码类型是gzip,我该怎么解压缩 ?HTTP头获取? 如何用vb获取网络上的xml文件,并解析内容 ?关于GZIP的解码 ?怎样解gzip的压缩 ?请问Wininet是否可以进行Gzip的http传输,尤其是post的时候!如果可以如何实现? 关于GZIP格式解压缩HTTP数据包的问题,我使用ZLIB为什么必须先保存文件,内存解压缩出错 ?无法获取$_SERVER["HTTP_REFERER"] 关于GZIP的问题,高分求解!! ..... 等都是关于gzip解压的 问题: 提取http的gzip内容,并解压。 关键点: 1 提取http数据包的内容,主要是gzip格式的 2 数据包的重组 3 在内存中解压gzip数据 这两个周过来,都是在网上过来的,得到网友的帮助不少,很是感激,为了不让这个问题继续困扰后来的un_gziper,特写此文。 1 数据包内存的提取: 关键的地方是找到gzip内存的开始位置以及如何确定gzip内容的大小 开始位置:&Content-Encoding: gzip/r/n/r/n& gzip大小:&Content-Length:&后面的就是了 2 数据包的重组,一般网页的内容很少是一个数据包可以装得下的,所以都得进行gzip之后再用多个数据包进行传输 关键的地方是: get请求数据包的ack和seq与http返回数据包的ack,seq有密切的联系: 举例说明: get请求:ack=0,seq=0 http1:seq=0,ack=584 http2: seq=1420,ack=584 ... 简单的分析说明可以看出,我们的算法设计: 首先得到get请求的ack,返回的数据包的seq等于这个值,同时记下这个数据包的ack,后面进行分包发送的http的数据包的ack都是这个值,这个是关键点之一,同时综合 Content-Length就可以得到gzip的全部内容。 至此,原始数据提取完毕,该是如何解压的问题了 3解压gzip 我做了上面的1,2步以后将内容保存到文件里面,用gzip命令可以打开,验证了数据的完整性。 而后我采用了zlib提供的uncompress函数,和大多数的网友一样,都是犯了一个致命的错误,没有仔细的阅读zlib的文档!导致一次次无谓的识别! 事实上zlib格式和gzib格式是有差别的,而uncompress是用来解压zlib格式文件的,这就是为什么会出现用compress函数压缩的数据,在内存中可以直接用uncompress函数进行解压的,而就不能解压gzip数据的问题! 后来测试了zlib包里面的example例子,算是对zlib有了一点点的了解,应该用inflate类函数进行解压! 当然这样遇到了问题,格式不对! 后来在网上看到的帖子:gzip格式用inflate函数还不行,必需要用inflateInit2(&strm,& 47); !!!!!!!!!!!!!!!!!! 问题解决! 这里借用那位网友的源代码,同时对他表示感谢!
补充:zlib版本需要在1.1.4以上(不包括) int
inflate_read(char
*source,int
**dest,int
out[CHUNK];
strm.zalloc
strm.zfree
strm.opaque
strm.avail_in
strm.next_in
ret = inflateInit2(&strm,
ret = inflateInit(&strm);
if (ret !=
strm.avail_in
strm.next_in
strm.avail_out
strm.next_out
inflate(&strm,
Z_NO_FLUSH);
assert(ret
Z_STREAM_ERROR);
Z_NEED_DICT:
Z_DATA_ERROR;
Z_DATA_ERROR:
Z_MEM_ERROR:
inflateEnd(&strm);
strm.avail_
realloc(*dest,totalsize);
memcpy(*dest
have,out,have);
(strm.avail_out
(void)inflateEnd(&strm);
Z_STREAM_END
Z_DATA_ERROR;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84324次
积分:1261
积分:1261
排名:千里之外
原创:36篇
转载:24篇
评论:19条
(1)(2)(1)(2)(4)(2)(2)(1)(1)(1)(2)(1)(3)(3)(8)(1)(4)(1)(6)(8)(2)(1)(2)(1)}

我要回帖

更多关于 iphone6s铃声设置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信