`
chenyu.hz
  • 浏览: 139648 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

java实现http代理服务

 
阅读更多

 

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代理服务器 Smart Cache

    它利用了Java的多线程和网络编程能力,实现了对HTTP协议的代理服务,并结合智能缓存策略,优化了数据传输效率。 在HTTP代理服务器的角色下,Smart Cache充当了一个中介,用户通过这个代理服务器向目标Web服务器发送...

    java实现的代理服务器

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

    Java写http代理服务器

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

    java 实现HTTP PROXY

    在Java中实现HTTP代理,主要涉及以下关键知识点: 1. **Socket编程**:Java的`java.net.Socket`和`java.net.ServerSocket`类是构建代理服务器的基础。`ServerSocket`用于监听特定端口上的连接请求,而`Socket`则...

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

    总的来说,这个Java代理服务器示例提供了一个基础的代理服务实现,有助于理解网络编程、HTTP协议以及Java中的多线程和网络通信机制。通过扩展这个基础代码,可以实现更复杂的代理功能,如缓存、访问控制、加密等。

    httpProxy-java

    总的来说,"httpProxy-java"项目涉及的是使用Java实现HTTP代理服务的技术,涵盖了网络编程、HTTP协议、多线程以及可能的额外功能如性能优化和安全控制。通过对这些项目的研究和学习,开发者可以深入理解HTTP代理的...

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

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

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

    然后,为了实现HTTP代理功能,我们需要解析和构造HTTP报文。Java的HttpURLConnection和HttpClient类可以方便地处理HTTP请求和响应,但可能需要自定义逻辑来适应代理服务器的特定需求,比如转发请求、修改请求头或...

    Java代理服务器的实现

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

    springboot集成netty实现代理服务器

    springboot集成netty实现代理服务器,实现http和https请求的代理功能

    使用Java基于Netty+Socks5+TLS实现的代理服务.zip

    在给定的标题“使用Java基于Netty+Socks5+TLS实现的代理服务.zip”中,我们可以看到三个核心概念:Netty、Socks5和TLS,这些都是构建高效、安全网络服务的关键组件。 Netty是一个高性能、异步事件驱动的网络应用...

    Java代理服务器程序

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

    java LAN使用代理服务器

    `Proxy.Type.HTTP`表示HTTP代理,`InetSocketAddress`则包含了代理服务器的主机名和端口号。 在使用`Proxy`对象进行网络请求时,通常需要将其传递给`Socket`或`HttpURLConnection`的构造函数。例如,对于`...

    Java编写的HTTP代理

    在Java中实现HTTP代理,开发者会利用Socket编程和HTTP协议的特性来构建这样的系统。 首先,我们需要理解HTTP协议。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到...

    tt.rar_ java_Java 代理服务器_java 线程_代理服务器_服务器

    Java代理服务器是一种网络通信工具,它允许客户端通过它与目标服务器进行通信,以此来隐藏原始客户端的IP地址或者实现特定的网络访问策略。在Java中实现代理服务器涉及到多个关键概念和技术,包括网络编程、多线程...

    java-jdk动态代理的实现demo

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

    java操作IE代理

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

    java HTTP代理源码

    - `proxy`目录可能包含了实现HTTP代理服务的主类或模块,负责启动和管理代理服务器。 - `ProxyTest`可能是一个测试类或测试用例,用于验证代理服务器的功能是否正常,可能包含创建HTTP请求并发送到代理服务器的...

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

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

Global site tag (gtag.js) - Google Analytics