/*************************************
* 一个基础的
代理服务器类
*************************************
*/
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
protected 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;
Socket sock;
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) {
}
}
// 测试用的简单main方法
static public void main(String args[]) {
System.out.println("在端口8080启动代理服务器\n");
HttpProxy.log=System.out;
HttpProxy.logging=false;
HttpProxy.startProxy(8080,HttpProxy.class);
}
}
分享到:
相关推荐
通过以上步骤,你可以构建一个基本的Java HTTP代理服务器。当然,实际的项目可能会涉及更多细节,如支持HTTPS、代理链、重定向处理、代理认证等。提供的压缩包文件可能包含有关此主题的教程、代码示例和相关资源,...
总的来说,Java代理服务器的实现涉及到网络编程、HTTP协议理解和多线程处理等多个方面,是一个很好的学习和实践Java技术的项目。你可以通过分析和修改提供的"JAVA实现代理服务器"源码,进一步提升你的网络编程技能。
【标题】:“Web代理服务器 RabbIT”是一个基于Java实现的网络代理服务器程序,它能够帮助用户通过代理访问Web资源。RabbIT这个名字可能是“Rapid and Basic Internet Traffic”的缩写,暗示了它在处理网络流量时的...
Java代理服务器程序是一种用于转发网络请求的应用,它在客户端与目标服务器之间起到中介的作用。这样的设计使得用户可以通过代理服务器访问互联网,从而实现多种功能,如匿名浏览、负载均衡、缓存优化、网络监控等。...
总结,这个“Java TCP服务器的基础框架”是一个利用Java NIO构建的、可配置的、支持并发连接的服务器框架。开发者可以通过理解并修改配置文件、源代码,以及启动脚本来定制自己的TCP服务器,满足特定应用场景的需求...
NanoHTTPD是一个轻量级的Java HTTP服务器,它被设计为简单易用,适用...在`NanoHTTPD.java`和`RouterNanoHTTPD.java`这两个文件中,你可以深入理解HTTP服务器的工作原理,并学习如何在Java中实现一个基本的Web服务器。
Java网络代理源代码是用于创建一个代理服务器的程序,它可以帮助开发者在调试和监控网络数据时获取必要的信息。这个源代码特别适用于理解如何利用Java的Socket编程实现网络代理功能。以下将详细介绍Java Socket和...
在本项目中,"Java基于TCP协议的多客户端与多服务器间通过一个代理服务器进行通信的Hotel Booking系统"是一个典型的分布式系统实现,旨在模拟实际的酒店预订流程。这个系统利用了Java编程语言的强大功能,结合TCP...
【标题】"基于Java的实例源码-Web代理服务器 RabbIT.zip" 是一个Java编程实践项目,旨在实现一个Web代理服务器。RabbIT(可能代表“快速代理服务器”或类似的含义)允许用户通过该代理服务访问互联网,提供了一种在...
- `ProxyTest`可能是一个测试类或测试用例,用于验证代理服务器的功能是否正常,可能包含创建HTTP请求并发送到代理服务器的示例代码。 4. **源码学习要点** - **代理服务器的初始化**:设置监听端口,启动服务器...
静态代理是代理模式的最基础形式,它通过创建一个实现了与目标对象相同接口的代理类来实现对目标对象的代理。以下是一个简单的静态代理示例: 1. **定义接口**:首先,我们需要一个业务接口,例如`Service`,其中...
这份“学习Java基础的好资料”包含了一系列深入浅出的Java知识,对于初学者和经验丰富的开发者来说,都是一个宝贵的资源库。 1. **Java语言基础**: - **语法结构**:了解Java的基本语法,包括数据类型(如整型、...
Java 实现的代理程序是一种网络通信工具,它允许客户端通过代理服务器访问其他网络资源,以提高安全性、匿名性或优化网络性能。...开发者可以通过阅读和学习这些源码,进一步理解Java网络编程和代理服务器的工作原理。
源码编写一个简单的HTTP代理服务器,首先需要理解HTTP的基本请求结构,包括GET、POST等方法,以及请求头和请求体的构成。接着,你需要使用合适的编程语言,如Python、Java或C++,来实现这个代理服务。这可能涉及创建...
1. 基本HTTP代理服务器:你需要设计并实现一个能在指定端口(如8080)接收HTTP请求的代理服务器。服务器将解析客户端的请求,根据URL访问相应的HTTP服务器(源服务器),获取响应后将其转发回客户端。 2. 支持Cache...
:尽管未给出具体的“清华教案”文件名,但可以推测这些文件可能按照课程章节或主题命名,如“Java基础教程”、“面向对象编程”、“异常处理”、“集合框架”等,每一份都详细讲解了Java语言的一个关键概念或技术。...
而像Apache HTTP Server、Nginx这样的反向代理服务器,以及JMS(Java Message Service)等中间件,也常在Java服务器环境中使用。 在深入学习以上知识点的基础上,结合实际项目经验,开发者能够设计和实现高效、健壮...
学习这个源码可以帮助我们理解HLS流媒体服务的工作原理,以及如何在Java环境中构建高效、灵活的代理服务器。同时,它也能提供一个基础,让我们能够根据实际需求进行定制和扩展,例如添加更多安全特性、支持更复杂的...
2. ** HelloWorld 程序**:初学者通常从编写第一个"Hello, World!"程序开始,这将介绍基本的语法结构,包括类定义、主方法(`main`)以及输出语句`System.out.println()`。 3. **数据类型**:Java支持两种数据类型...
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...