Socket HTTP页面请求后对gzip页面的解压缩实现代码

需要注意的有以下几点:

 

1、通过socket页面请求后的receive内容不能经过string后再进行解压缩处理 会造成错误的gzip幻数报错

      推荐使用流处理

2、正确分析返回内容 分割header和页面代码部分

3、对页面代码部分进行解压缩

4、重组header与解压缩后的页面代码

 

解压缩使用net2.0的GZipStream类 很方便

 

代码如下:

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO.Compression;
  5. using System.IO;
  6. using ICSharpCode.SharpZipLib.GZip;
  7. namespace 贴吧江湖
  8. {
  9.     public  class clsGzip
  10.     {
  11.         public static string DecompressGzip(MemoryStream stm)
  12.         {
  13.             string strHTML = "";
  14.           
  15.            
  16.             GZipStream gzip = new GZipStream(stm, CompressionMode.Decompress);//解压缩
  17.             using (StreamReader reader = new StreamReader(gzip, Encoding.GetEncoding("gb2312")))//中文编码处理
  18.             {
  19.                 strHTML = reader.ReadToEnd();
  20.             }
  21.             
  22.             return strHTML;
  23.         }
  24.     }
  25. }

socket类中对此方法的调用

 

  1. int bytes = 0;
  2.             string page = "";
  3.             MemoryStream ms = new MemoryStream();
  4.             
  5.             
  6.             
  7.             do
  8.             {
  9.                 bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
  10.                 
  11.                 //Encoding gb2312 = Encoding.GetEncoding("gb2312");//将读取的字节数转换为字符串   
  12.                 //page = page + gb2312.GetString(bytesReceived, 0, bytes);
  13.                 ms.Write(bytesReceived, 0, bytes);
  14.                 
  15.                 //Console.WriteLine(bytes);
  16.             }
  17.             while (bytes > 0);
  18.             s.Close();
  19.             Console.WriteLine(ms.Length);
  20.             ms.Seek(0, SeekOrigin.Begin);//将流的读写位置移动到开头
  21.             Encoding gb2312 = Encoding.GetEncoding("gb2312");//准备获取HTTP header中页面内容的大小
  22.             
  23.             page = new StreamReader(ms, gb2312).ReadToEnd();//将流读入到字符串准备分割
  24.             string[] sArray = page.Split(new string[] { "/r/n/r/n" }, StringSplitOptions.RemoveEmptyEntries);//分割web服务器返回代码 分为头域和页面代码
  25.             page = page.Substring(page.IndexOf("Content-Length: ") + 16);//分割字符串获得页面内容大小
  26.             page = page.Substring(0, page.IndexOf("/r/n"));
  27.             //Console.WriteLine(page);//输出经过gzip压缩的页面内容的大小
  28.             long begin = ms.Length - Convert.ToInt64(page);//流长度-页面内容大小就是我们需要的页面内容在流内的起始位置
  29.             ms.Seek(begin, SeekOrigin.Begin);//移动到此位置
  30.             page = clsGzip.DecompressGzip(ms);//将流传递给解压缩方法
  31.             //Console.WriteLine(begin);
  32.             page = sArray[0] + "/r/n/r/n" + page;//将header与解压缩后的页面内容重新组合
  33.             //Console.WriteLine(page);
  34.             return page;

发送页面请求的时候注意加上Accept-Encoding: gzip, deflate/r/n

 

终于解决了。。。还希望有朋友遇到相同的问题少走弯路

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值