JAVA版 Http代理服务器

来源:互联网 发布:数控加工编程 编辑:程序博客网 时间:2024/06/05 21:52

package Server;

import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.OutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.SocketTimeoutException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.net.*;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2008</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class HttpProxy extends Thread {
    Socket socket = null;

    public HttpProxy(Socket c) {
        this.socket = c;
        this.start();
    }


    public void run() {
        byte bytes[] = new byte[1024];

        try {
            socket.setSoTimeout(20);
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            int ch = in.read();
            String line = "";
            while (ch != -1) {
                line += (char) ch;
                if (ch == 13) {
                    break;
                }
               ch = in.read();
            }
            String u = line.split(" ")[1];
            URL url = new URL(u);
            int port = url.getPort();
            if (port == -1) {
                port = url.getDefaultPort();
            }
            Socket request = null;
            try {
                request = new Socket(url.getHost(), port);
            }catch(ConnectException ex){
                socket.close();
                ex.printStackTrace();
            }
            catch(UnknownHostException ex){
                socket.close();
                ex.printStackTrace();
            } catch (IOException ex) {
                socket.close();
                ex.printStackTrace();
            }
            if (!socket.isClosed()) {
                request.setSoTimeout(1000);
                OutputStream requestOut = request.getOutputStream();
                requestOut.write(line.getBytes());
                try{
                    while ((ch = in.read(bytes)) > 0) {
                        requestOut.write(bytes, 0, ch);
                        requestOut.flush();
                    }
                } catch (SocketTimeoutException ex) {
                }
                InputStream requestIn = request.getInputStream();
                try {
                    while ((ch = requestIn.read(bytes)) > 0) {
                        out.write(bytes, 0, ch);
                    }
                } catch (SocketTimeoutException ex) {
                    request.close();
                }
                out.close();
                in.close();
                socket.close();
               
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ServerSocket ssock;
        Socket c;
        try {
            ssock = new ServerSocket(9000);
            while (true) {
                c = ssock.accept();
                new HttpProxy(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

还有很多问题存在,但基本的已经实现