From 67298d9c3d9ccc3e6ff7e82b57cebad18edcda20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E5=85=B5?= <1040003585@qq.com> Date: Wed, 22 Jun 2016 00:21:00 +0800 Subject: [PATCH 1/2] Update HttpProxy.java --- .../HttpProxy.java" | 72 +++++++++---------- 1 file changed, 33 insertions(+), 39 deletions(-) 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..553d70f 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; - } - state = 1; - break; + case 0: + if(isspace)continue; + state=1; case 1: - if (space) { - state = 2; + if(isspace){ + state=2; continue; } - line = line + (char) c; + line = line + c; break; case 2: - if (space) { - continue; - } - state = 3; - break; + if(isspace)continue; + state=3; 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; From ae3ec0dd18002a578a39ad63e2bc553afb9574fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E5=85=B5?= <1040003585@qq.com> Date: Wed, 22 Jun 2016 00:24:20 +0800 Subject: [PATCH 2/2] Update HttpProxy.java --- .../HttpProxy.java" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 553d70f..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" @@ -99,18 +99,18 @@ public void run() { space = Character.isWhitespace((char) c); switch (state) { case 0: - if(isspace)continue; - state=1; + if(space) continue; + state = 1; case 1: - if(isspace){ - state=2; + if(space){ + state = 2; continue; } line = line + c; break; case 2: - if(isspace)continue; - state=3; + if(space) continue; + state = 3; case 3: if (space) { state = 4;