被大牛带着做了个http代理的工具,实现代理并存储request和response信息,并可读取相关本地已存储的信息即假数据。
感谢万能的乐哥。
在这里总结下遇到的几个问题。
1、http长连接。
一开始对于
开启的请求,我们试图对每个http请求开启一个
线程,以提高代理请求的速度。
对比实际情况,我们模拟需要的线程数为20个,然后开启了定长线程池,一开始测试,代理成功,拦截下的数据也存入了本地。可再请求第二个网站的时候,会
发现请求一直在等待,查看线程状态,发现20个线程都没有结束。然后我们将线程数开成50,还是同样的情况。后来想开始缓存线程池,结果可以多请求几次,可观察发现线程数巨大,最后还是卡死了。最后查看http请求的特性和已存下的
请求数据发现是长连接的原因,一个连接会使用多次,所以我们很难判断这个这个连接是否结束,所以用对于每个url请求对应一个线程的做法,我们规避不了问题,所以换成一个长连接一个url。不过经测试,速度也不是也别慢,毕竟大多数还是文本数据。
2、gzip的问题。
代理的问题解决了,就是本地缓存的问题了,一开始测试的网站没有用gzip压缩,缓存出来的数据,本地是可读的。就没注意,可后来多用几个网站测试,就发现了gzip的问题,不过这只是本地可不可读的问题,如果直接将缓存的压缩数据返回到浏览器,浏览器依旧是可以辨识出来的,这时候我才慢慢的没有太过害怕http
协议,毕竟以前没有接触过,所以刚开始还是比较抵触的。在翻提供的工具类的时候看到了有gzip的输入输出类,所以自己将缓存本地文件的输出流包装了下,就解决的缓存的问题。
3、chunked的问题。
压缩的问题解决了,然后然后就是chunked的问题了,一开始自己不太清楚chunked的意思,只是觉得同样是gzip,和chunked的方式,一些请求成功了,一些请求失败了,感觉很奇怪。不过看看解释,在网站找了些代码,就找到了一个别人
解析chunked的代码,看着思路和chunked的思想差不多,可是测试的时候还是有问题,然后自己一个字节一个字节的跑,虽然读出来的数据和要解析的数据差不多,可是就是解析完chunked,再用gzip解析的话,仍然成功不了。很困惑,不知道却些什么。(chunked的方式就是将一个大的文本数据,分为几段压缩,并在数据前面有16进制的length说明,以便
解压缩)。这个问题一直解释不了,问了乐哥也是没有结果,后来自己实在没办法,就和乐哥两人一起翻工具类,翻了很久,在网上查也查不出什么相关博客和讲解,突发奇想,想着工具类里面有没有类似于gzip的给chunked写的输入输出流,没想到还真找到了,依旧是利用chunked的输出流将inputStream封装。最后解析的流程是,解析响应头,判断是否是gzip的方式,如果是gzip,再判断是否是chunked。如果是chunked,先拼接数据,再利用gzip解压,将数据缓存本地,并将gzip和chunked的关键词去掉。
以上是遇到的比较大的问题,再次感谢万能的乐哥。让我从对网络编程比较害怕排斥到现在的这个状态,第一次写博客,写的不对请指出,最后的遗憾是这个工具只支持http而不支持https。希望以后能改进。
因为是代码不在自己的电脑上,无法
分享见谅。