`
MaiShirosaki
  • 浏览: 528 次
文章分类
社区版块
存档分类
最新评论

http代理,java实现

阅读更多
    被大牛带着做了个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。希望以后能改进。
    因为是代码不在自己的电脑上,无法分享见谅。
分享到:
评论

相关推荐

    Java实现的反向代理程序(源码版)

    使用Java编写的反向代理程序(源代码),通过简单的参数配置即可实现某些特定站点的反向代理,并在此过程中改变一些站点的特定行为。例如:允许特点站点跨域访问被代理的站点,或者屏蔽被代理站点识别请求访问客户端...

    java实现的代理服务器

    总之,Java实现的代理服务器是通过Java的Socket编程接口实现的,它能帮助我们更好地理解和实践代理服务器的工作原理。通过分析`HttpProxy.java`和`SubHttpProxy.java`的代码,我们可以深入学习网络编程和代理服务器...

    java 实现HTTP PROXY

    Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...

    基于Java多线程的HTTP代理服务器的研究与实现.pdf

    《基于Java多线程的HTTP代理服务器的研究与实现》这篇文档深入探讨了如何利用Java语言构建一个高效的多线程HTTP代理服务器。在信息技术领域,HTTP代理服务器扮演着至关重要的角色,它作为客户端与目标服务器之间的...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...

    Java的HTTP代理服务器 Smart Cache

    "Java的HTTP代理服务器 Smart Cache" 是一个基于Java开发的网络工具,主要用于处理HTTP网络请求,同时具备缓存功能,可以提升数据访问速度并减轻服务器压力。它利用了Java的多线程和网络编程能力,实现了对HTTP协议...

    代理服务器实现-java(源码)

    在这个Java实现中,我们将探讨如何构建一个简单的代理服务器,并了解涉及的关键概念和技术。 1. **Java基础知识**: - `JFrame` 是Java Swing库中的一个类,用于创建窗口应用程序的基础框架。 - `JTextArea` 是一...

    java操作IE代理

    这些函数可能包括设置HTTP代理、设置SOCKS代理、启用或禁用代理等。 4. **操作注册表**:通过`registry.jar`提供的API,读取或写入注册表中的关键值,如`HKEY_CURRENT_USER\Software\Microsoft\Windows\Current...

    Java写http代理服务器

    在Java中实现HTTP代理服务器,主要涉及到以下几个关键步骤和知识点: 1. **网络编程基础**:熟悉Java的Socket编程是首要的,因为HTTP通信基于TCP/IP协议,我们需要使用Socket来建立客户端和服务器之间的连接。`java...

    Java编写的HTTP代理

    Java编写的HTTP代理是一种软件应用,它允许用户通过Java程序作为中介来访问互联网,从而实现对HTTP请求的转发。这种代理服务器通常用于多种用途,包括网络匿名性、内容过滤、性能优化以及网络测试等。在Java中实现...

    java HTTP代理源码

    本项目提供了两种不同的Java实现HTTP代理的源代码,这为开发者提供了一个了解和学习HTTP代理原理及其实现的平台。 1. **HTTP代理的基本概念** - **HTTP协议**:超文本传输协议,是互联网上应用最广泛的一种网络...

    Java代理服务器的实现

    本文将详细介绍如何在Java中实现一个简单的HTTP代理服务器。 #### 核心代码解析 根据提供的部分代码,我们可以看到作者通过继承`Thread`类创建了一个名为`HttpProxy`的类。这个类负责处理来自客户端的连接,并将...

    JAVA HTTP反向代理实现过程详解

    JAVA HTTP反向代理实现过程详解 本文主要介绍了JAVA HTTP反向代理实现过程详解,对大家的学习或者工作具有一定的参考学习价值。 一、什么是反向代理? 反向代理(Reverse Proxy)方式是指以代理服务器来接受...

    Java代理服务器程序

    在这个Java实现的代理服务器程序中,我们可以深入探讨几个关键的技术点。 首先,代理服务器的核心是网络通信。Java提供了丰富的网络编程API,如java.net包中的Socket和ServerSocket类。ServerSocket用于监听客户端...

    利用JAVA代理Proxy机制实现spring对ibaits的MapperScannerConfigurer功能

    利用JAVA代理Proxy机制实现spring对ibaits的MapperScannerConfigurer功能 详细:http://blog.csdn.net/wq105032007067/article/details/8812598

    java-websocket-reverse-proxy:Websocket反向代理的Java实现

    Websocket反向代理的Java实现。 与描述的方法类似,但使用Java实现。 这在Java应用程序服务器(例如Spring Boot)中可能很有用。 在根级别有一些nodejs脚本,可用于模仿验证代理服务器所需的功能。 常见的是脚本,...

    Java采集最新动态代理IP

    本文将深入探讨如何使用Java结合Jsoup库来实现代理IP的爬取,以突破IP访问限制,实现动态IP代理。 首先,让我们了解什么是Java爬虫。Java爬虫是使用Java语言编写的一种程序,它能够自动地遍历互联网上的网页,抓取...

    java网络代理源代码

    4. **Java实现网络代理的关键步骤**: - 创建ServerSocket实例,指定监听的端口号。 - 在ServerSocket上接受来自客户端的连接,返回一个新的Socket实例。 - 读取Socket的InputStream,获取客户端发送的请求。 - ...

    java代理实现代码

    使用继承和组合的方式实现代理模式,对比分析了继承和组合在实现代理上面的不同,具体信息请看博客:http://blog.csdn.net/y_love_f/article/details/46291001

Global site tag (gtag.js) - Google Analytics