package httpProxy;
/*************************************
* 一个基础的代理服务器类
*************************************
*/
import java.net.*;
import java.io.*;
public class HttpProxy extends Thread {
static public int CONNECT_RETRIES = 5;
static public int CONNECT_PAUSE = 5;
static public int TIMEOUT = 50;
static public int BUFSIZ = 1024;
static public boolean logging = false;
static public OutputStream log = null;
// 传入数据用的Socket
static public Socket socket;
// 上级代理服务器,可选
static private String parent = null;
static private int parentPort = -1;
static public void setParentProxy(String name, int pport) {
parent = name;
parentPort = pport;
}
// 在给定Socket上创建一个代理线程。
public HttpProxy(Socket s) {
socket = s;
start();
}
public void writeLog(int c, boolean browser) throws IOException {
log.write(c);
}
public void writeLog(byte[] bytes, int offset, int len, boolean browser)
throws IOException {
for (int i = 0; i < len; i++)
writeLog((int) bytes[offset + i], browser);
}
// 默认情况下,日志信息输出到
// 标准输出设备
// 派生类可以覆盖它
public String processHostName(String url, String host, int port, Socket sock) {
java.text.DateFormat cal = java.text.DateFormat.getDateTimeInstance();
System.out.println(cal.format(new java.util.Date()) + " - " + url + " "
+ sock.getInetAddress() + "\n");
return host;
}
// 执行操作的线程
public void run() {
String line;
String host;
int port = 80;
Socket outbound = null;
try {
socket.setSoTimeout(TIMEOUT);
InputStream is = socket.getInputStream();
OutputStream os = null;
try {
// 获取请求行的内容
line = "";
host = "";
int state = 0;
boolean space;
while (true) {
int c = is.read();
if (c == -1)
break;
if (logging)
writeLog(c, true);
space = Character.isWhitespace((char) c);
switch (state) {
case 0:
if (space)
continue;
state = 1;
case 1:
if (space) {
state = 2;
continue;
}
line = line + (char) c;
break;
case 2:
if (space)
continue; // 跳过多个空白字符
state = 3;
case 3:
if (space) {
state = 4;
// 只取出主机名称部分
String host0 = host;
int n;
n = host.indexOf("//");
if (n != -1)
host = host.substring(n + 2);
n = host.indexOf('/');
if (n != -1)
host = host.substring(0, n);
// 分析可能存在的端口号
n = host.indexOf(":");
if (n != -1) {
port = Integer.parseInt(host.substring(n + 1));
host = host.substring(0, n);
}
host = processHostName(host0, host, port, socket);
if (parent != null) {
host = parent;
port = parentPort;
}
int retry = CONNECT_RETRIES;
while (retry-- != 0) {
try {
outbound = new Socket(host, port);
break;
} catch (Exception e) {
}
// 等待
Thread.sleep(CONNECT_PAUSE);
}
if (outbound == null)
break;
outbound.setSoTimeout(TIMEOUT);
os = outbound.getOutputStream();
os.write(line.getBytes());
os.write(' ');
os.write(host0.getBytes());
os.write(' ');
pipe(is, outbound.getInputStream(), os,
socket.getOutputStream());
break;
}
host = host + (char) c;
break;
}
}
} catch (IOException e) {
}
} catch (Exception e) {
} finally {
try {
socket.close();
} catch (Exception e1) {
}
try {
outbound.close();
} catch (Exception e2) {
}
}
}
void pipe(InputStream is0, InputStream is1, OutputStream os0,
OutputStream os1) throws IOException {
try {
int ir;
byte bytes[] = new byte[BUFSIZ];
while (true) {
try {
if ((ir = is0.read(bytes)) > 0) {
os0.write(bytes, 0, ir);
if (logging)
writeLog(bytes, 0, ir, true);
} else if (ir < 0)
break;
} catch (InterruptedIOException e) {
}
try {
if ((ir = is1.read(bytes)) > 0) {
os1.write(bytes, 0, ir);
if (logging)
writeLog(bytes, 0, ir, false);
} else if (ir < 0)
break;
} catch (InterruptedIOException e) {
}
}
} catch (Exception e0) {
System.out.println("Pipe异常: " + e0);
}
}
static public void startProxy(int port, Class clobj) {
ServerSocket ssock;
try {
ssock = new ServerSocket(port);
while (true) {
Class[] sarg = new Class[1];
Object[] arg = new Object[1];
sarg[0] = Socket.class;
try {
java.lang.reflect.Constructor cons = clobj
.getDeclaredConstructor(sarg);
arg[0] = ssock.accept();
cons.newInstance(arg); // 创建HttpProxy或其派生类的实例
} catch (Exception e) {
Socket esock = (Socket) arg[0];
try {
esock.close();
} catch (Exception ec) {
}
}
}
} catch (IOException e) {
}
}
static public void stopProxy(){
try {
if(null!=HttpProxy.socket)
HttpProxy.socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 测试用的简单main方法
static public void main(String args[]) {
System.out.println("在端口808启动代理服务器\n");
HttpProxy.log = System.out;
HttpProxy.logging = false;
HttpProxy.startProxy(808, HttpProxy.class);
}
}
- 大小: 14.6 KB
分享到:
相关推荐
springboot集成netty实现代理服务器,实现http和https请求的代理功能
使用Java编写的反向代理程序(源代码),通过简单的参数配置即可实现某些特定站点的反向代理,并在此过程中改变一些站点的特定行为。例如:允许特点站点跨域访问被代理的站点,或者屏蔽被代理站点识别请求访问客户端...
Java HTTP / HTTPS代理服务器代理服务器代理服务器是位于客户端和客户端希望从中检索文件的远程服务器之间的服务器。 来自客户端的所有流量都被发送到代理服务器,并且代理服务器代表客户端向远程服务器发出请求。 ...
主要介绍了JAVA HTTP反向代理实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://cn-done.iteye.com/blog/1743191
实现了一份jdk动态代理的demo,做了详细注释,供以后复习使用,另外,这里为什么需要大于100个字节才能传资源?我就不想那么多不行吗???
java实现http协议jar包,是一个访问http协议工具类,导入全部jar包到项目里面,调用httpRequest方法及可实现http协议访问,以及获取代理IP方法封装
使用继承和组合的方式实现代理模式,对比分析了继承和组合在实现代理上面的不同,具体信息请看博客:http://blog.csdn.net/y_love_f/article/details/46291001
利用JAVA代理Proxy机制实现spring对ibaits的MapperScannerConfigurer功能 详细:http://blog.csdn.net/wq105032007067/article/details/8812598
基于Netty实现的内网穿透&反向代理的工具 (支持TCP上层协议和HTTP的穿透式反向代理).zip
NULL 博文链接:https://sunshineyao.iteye.com/blog/976871
java的代理Http实现源代码,有2钟,看谁有时间的话,可以改写一下
这是一个用Java编写的简单代理服务器,带有标准库,要在计算机上运行它,只需编译Java文件并输入 $ java WebProxy <$端口_运行_>
jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...
在实现过程中,我们将采用Java语言和Socket编程技术,借助第三方库实现HTTP协议的解析和封装,同时使用多线程技术实现并发处理。具体实现包括: 1. 建立Socket连接,监听客户端请求。 2. 解析HTTP请求报文,获取...
23种设计模式的java实现。创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html 工厂方法 http://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html 建造者模式 ...
这是一款http代理服务器,是用java实现的socket编程,实现代理,过滤的功能
演示了Java动态代理技术,学习查看详细的实现细节,更多代码的说明请参考博客文章 :http://520code.net/index.php/archives/19/
对应的博客链接:http://blog.csdn.net/JQ_AK47/article/details/60469034#t12
转发代理实现,它是健壮的和 CPU 内存高效的。 快速开始 此 repo 带有存储在bin/lib/nio-http-roxy.jar因此您可以简单地运行代理 JAVA_HOME= ${path_to_java8} \ ./bin/run-nio-http-proxy.sh 您还可以重建并运行 ...