加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java实现http代理服务

发布时间:2020-12-14 23:38:26 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 package httpProxy; /************************************* * 一个基础的代理服务器类 ************************************* */ import java.net.

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    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,ir);  
                            if (logging)  
                                writeLog(bytes,ir,true);  
                        } else if (ir < 0)  
                            break;  
                    } catch (InterruptedIOException e) {  
                    }  
                    try {  
                        if ((ir = is1.read(bytes)) > 0) {  
                            os1.write(bytes,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);  
        }  
    }  



来自:http://chenyu-hz.iteye.com/blog/1493227

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读