diff --git "a/src/\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/HttpProxy.java" "b/src/\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/HttpProxy.java" index 6829b7a..a596ff9 100644 --- "a/src/\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/HttpProxy.java" +++ "b/src/\344\273\243\347\220\206\346\234\215\345\212\241\345\231\250/HttpProxy.java" @@ -1,4 +1,4 @@ -package ; +package 代理服务器; import java.io.IOException; import java.io.InputStream; @@ -10,41 +10,41 @@ import java.util.Date; /** - * һĻƣ 1ȴԿͻWeb 2һµ̣߳Ѵͻ - * 3ȡĵһУݰĿURL 4ĵһݣõĿֺͶ˿ - * 5һͨĿһSocket 6ĵһз͵Socket 7ʣಿַ͵Socket - * 8ĿWebصݷ͸ + * 一个代理服务器的基本设计: (1)等待来自客户(Web浏览器)的请求 (2)启动一个新的线程,已处理客户连接请求 + * (3)读取浏览器请求的第一行(该行内容包含了请求的目标URL) (4)分析请求的第一行内容,得到目标服务器的名字和端口 + * (5)打开一个通向目标服务器(或下一个代理服务器)的Socket (6)把请求的第一行发送到输出Socket (7)把请求的剩余部分发送到输出Socket + * (8)把目标Web服务器返回的数据发送给发出请求的浏览器 * * @author skyward * */ public class HttpProxy extends Thread { - // ڷ֮ǰԶĴ + // 在放弃之前尝试连接远程主机的次数 static public int CONNECT_RETRIES = 5; - // ӳ֮ͣʱ + // 在两次连接尝试之间的暂停时间 static public int CONNECT_PAUSE = 5; - // ȴSocketĵȴʱ + // 等待Socket输入的等待时间 static public int TIME_OUT = 50; - // Socket뻺ĴС + // Socket输入缓冲的大小 static public int BUFSIZ = 1024; - // ǷҪ־м¼Ѵݣtrueʾǡ + // 是否要求代理服务器在日志中记录所有已传输的数据(true表示“是”) static public boolean logging = false; - // һOutputStreamĬ־̽OutputStream־Ϣ - static public OutputStream log_C = null; // - static public OutputStream log_S = null; // Web - // õSocket + // 一个OutputStream对象,默认日志例程将向该OutputStream对象输出日志信息 + static public OutputStream log_C = null; // 浏览器输出流 + static public OutputStream log_S = null; // Web主机输出流 + // 传入数据用的Socket protected Socket socket; - // ϼѡ + // 上级代理服务器,可选 static private String parent = null; static private int parentPort = -1; - // һӵһҪָһƺͶ˿ + // 用来把一个代理服务器链接到另一个代理服务器(需要指定另一个代理服务器的名称和端口 static public void setParentProxy(String name, int port) { parent = name; parentPort = port; } - // ڸSocketϴһ߳ + // 在给定Socket上创建一个代理线程 public HttpProxy(Socket s) { socket = s; start(); @@ -65,7 +65,7 @@ public void writeLog(byte[] bytes, int offset, int len, boolean browser) } } - // Ĭ£־Ϣ׼豸Ը + // 默认情况下,日志信息输出到标准输出设备,派生类可以覆盖它 public String processHostName(String url, String host, int port, Socket socket) { DateFormat cal = DateFormat.getDateTimeInstance(); @@ -74,7 +74,7 @@ public String processHostName(String url, String host, int port, return host; } - // ִв߳ + // 执行操作的线程 public void run() { String line; String host; @@ -85,7 +85,7 @@ public void run() { InputStream is = socket.getInputStream(); OutputStream os = null; try { - // ȡе + // 获取请求行的内容 line = ""; host = ""; int state = 0; @@ -98,29 +98,23 @@ public void run() { writeLog(c, true); space = Character.isWhitespace((char) c); switch (state) { - case 0: - if (space) { - continue; - } + case 0: + if(space) continue; state = 1; - break; case 1: - if (space) { + if(space){ state = 2; continue; } - line = line + (char) c; + line = line + c; break; case 2: - if (space) { - continue; - } + if(space) continue; state = 3; - break; case 3: if (space) { state = 4; - // ֻƲ + // 只分析主机名称部分 String host0 = host; int n; n = host.indexOf("//"); @@ -129,7 +123,7 @@ public void run() { n = host.indexOf('/'); if (n != -1) host = host.substring(0, n); - // ܴڵĶ˿ں + // 分析可能存在的端口号 n = host.indexOf(":"); if (n != -1) { port = Integer.parseInt(host.substring(n + 1)); @@ -146,7 +140,7 @@ public void run() { outbound = new Socket(host, port); break; } catch (Exception e) { - // ʧܣȴ + // 连接失败,等待 Thread.sleep(CONNECT_PAUSE); } } @@ -211,7 +205,7 @@ public void pipe(InputStream cis, InputStream sis, OutputStream cos, } } } catch (Exception e) { - System.out.println("Pipe쳣" + e); + System.out.println("Pipe异常" + e); } } @@ -240,7 +234,7 @@ public static void startProxy(int port, Class clobj) { } public static void main(String[] args) { - System.out.println("ڶ˿808"); + System.out.println("在端口808启动代理服务器"); HttpProxy.log_C = System.out; HttpProxy.log_S = System.out; HttpProxy.logging = false;