# HttpProxy **Repository Path**: 563000524/HttpProxy ## Basic Information - **Project Name**: HttpProxy - **Description**: 基于java实现的中继代理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-07-16 - **Last Updated**: 2022-07-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HttpProxy概要设计 [toc] ## 概述 因为公司不能听网易云,为了突破网络线程,尝试将我的一台云主机作为代理突破网络限制。思路是参考[HTTP中继(代理)、隧道相关介绍及简单Java实现](https://blog.csdn.net/u011995362/article/details/53729512)这篇博文的,写的超级棒。 ## 使用 基于java编写,需要jdk1.7或以上的环境 1. 打jar包 mvn clean install -DskipTests -Ptest 2. 执行 nohup java -jar httpproxy.jar >out.log 2>&1 & 3. 输入Ip和端口8008进行代理测试 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0716/150126_50e15ecc_1075187.png "无标题.png") ## 名词定义 本地主机为A端,目标为B端 ## 思路 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0817/095243_d5985cab_1075187.png "20180817093118769.png") 因为公司网络的限制A端不能直连B端,但是本地可以连接我自己的腾讯云主机,而我的腾云讯主机可以访问网易云,所以将我的腾讯云主机作为中转即可突破网络限制,这应该也是梯子的原理(我没了解过梯子,不过我想如果我的主机是国外主机,代理之后应该是可以访问外网的)。 接下来说一下整体的设计, 1. A端和主机建立socket连接 2. A端发送Http请求头到主机 3. 主机解析Http请求头,获得B端地址 4. 主机和B端建立socket连接 5. A端发送的数据发送到B端的socket 6. B端回来的数据发送到A端的socket,主机只做中转,不对数据做任何处理 ## 代码迭代 第一版的代码90%参考了那篇博文,使用io方式建立连接,因为io方式的数据传输是阻塞的,所以这样做的结果就是需要创建极多线程去处理IO流:一个请求一个线程,A发送到B一个线程,B发送到A一个线程,一个请求需要创建3个线程去处理,程序经常跑几个小时后就挂了,不过也能用。 第二版的代码因为自己看了nio的东西,异步的模型和selector使用一个线程即可管理所有连接的特性可以很好的解决第一版代码的问题,所以尝试使用nio的方式去重写代码,大概用了两个整天,中间走了很多弯路,感觉自己好蠢。部署上去后尝试了一下,一天了还是正常运行,吾心甚慰,代码细节还需改造,我打算看完io、nio文章和源码,写完相关的笔记后再进行修改。