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
分享到:
相关推荐
它利用了Java的多线程和网络编程能力,实现了对HTTP协议的代理服务,并结合智能缓存策略,优化了数据传输效率。 在HTTP代理服务器的角色下,Smart Cache充当了一个中介,用户通过这个代理服务器向目标Web服务器发送...
总之,Java实现的代理服务器是通过Java的Socket编程接口实现的,它能帮助我们更好地理解和实践代理服务器的工作原理。通过分析`HttpProxy.java`和`SubHttpProxy.java`的代码,我们可以深入学习网络编程和代理服务器...
在Java中实现HTTP代理服务器,主要涉及到以下几个关键步骤和知识点: 1. **网络编程基础**:熟悉Java的Socket编程是首要的,因为HTTP通信基于TCP/IP协议,我们需要使用Socket来建立客户端和服务器之间的连接。`java...
在Java中实现HTTP代理,主要涉及以下关键知识点: 1. **Socket编程**:Java的`java.net.Socket`和`java.net.ServerSocket`类是构建代理服务器的基础。`ServerSocket`用于监听特定端口上的连接请求,而`Socket`则...
总的来说,这个Java代理服务器示例提供了一个基础的代理服务实现,有助于理解网络编程、HTTP协议以及Java中的多线程和网络通信机制。通过扩展这个基础代码,可以实现更复杂的代理功能,如缓存、访问控制、加密等。
总的来说,"httpProxy-java"项目涉及的是使用Java实现HTTP代理服务的技术,涵盖了网络编程、HTTP协议、多线程以及可能的额外功能如性能优化和安全控制。通过对这些项目的研究和学习,开发者可以深入理解HTTP代理的...
使用Java编写的反向代理程序(源代码),通过简单的参数配置即可实现某些特定站点的反向代理,并在此过程中改变一些站点的特定行为。例如:允许特点站点跨域访问被代理的站点,或者屏蔽被代理站点识别请求访问客户端...
然后,为了实现HTTP代理功能,我们需要解析和构造HTTP报文。Java的HttpURLConnection和HttpClient类可以方便地处理HTTP请求和响应,但可能需要自定义逻辑来适应代理服务器的特定需求,比如转发请求、修改请求头或...
本文将详细介绍如何在Java中实现一个简单的HTTP代理服务器。 #### 核心代码解析 根据提供的部分代码,我们可以看到作者通过继承`Thread`类创建了一个名为`HttpProxy`的类。这个类负责处理来自客户端的连接,并将...
springboot集成netty实现代理服务器,实现http和https请求的代理功能
在给定的标题“使用Java基于Netty+Socks5+TLS实现的代理服务.zip”中,我们可以看到三个核心概念:Netty、Socks5和TLS,这些都是构建高效、安全网络服务的关键组件。 Netty是一个高性能、异步事件驱动的网络应用...
在这个Java实现的代理服务器程序中,我们可以深入探讨几个关键的技术点。 首先,代理服务器的核心是网络通信。Java提供了丰富的网络编程API,如java.net包中的Socket和ServerSocket类。ServerSocket用于监听客户端...
`Proxy.Type.HTTP`表示HTTP代理,`InetSocketAddress`则包含了代理服务器的主机名和端口号。 在使用`Proxy`对象进行网络请求时,通常需要将其传递给`Socket`或`HttpURLConnection`的构造函数。例如,对于`...
在Java中实现HTTP代理,开发者会利用Socket编程和HTTP协议的特性来构建这样的系统。 首先,我们需要理解HTTP协议。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到...
Java代理服务器是一种网络通信工具,它允许客户端通过它与目标服务器进行通信,以此来隐藏原始客户端的IP地址或者实现特定的网络访问策略。在Java中实现代理服务器涉及到多个关键概念和技术,包括网络编程、多线程...
Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...
这些函数可能包括设置HTTP代理、设置SOCKS代理、启用或禁用代理等。 4. **操作注册表**:通过`registry.jar`提供的API,读取或写入注册表中的关键值,如`HKEY_CURRENT_USER\Software\Microsoft\Windows\Current...
- `proxy`目录可能包含了实现HTTP代理服务的主类或模块,负责启动和管理代理服务器。 - `ProxyTest`可能是一个测试类或测试用例,用于验证代理服务器的功能是否正常,可能包含创建HTTP请求并发送到代理服务器的...
JAVA HTTP反向代理实现过程详解 本文主要介绍了JAVA HTTP反向代理实现过程详解,对大家的学习或者工作具有一定的参考学习价值。 一、什么是反向代理? 反向代理(Reverse Proxy)方式是指以代理服务器来接受...