Java:在我的ProxyServer中处理浏览器的请求

Java:在我的ProxyServer中处理浏览器的请求,java,sockets,proxy,Java,Sockets,Proxy,我正在编写ProxyServer,首先我使用ServerSocket获取连接到我的套接字。然后我从连接的套接字获取InputStream并读取它。我已将浏览器的请求输出到控制台: GET http://mail.ru/ HTTP/1.1 Host: mail.ru Proxy-Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User

我正在编写ProxyServer,首先我使用ServerSocket获取连接到我的套接字。然后我从连接的套接字获取InputStream并读取它。我已将浏览器的请求输出到控制台:

GET http://mail.ru/ HTTP/1.1
Host: mail.ru
Proxy-Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/31.0.1650.63 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: p=7nkAAOS6hAAA; mrcu=7D86524D326C5CB36F898F4A4CD9;
_ga=GA1.2.1174941236.1388398432; c=PCwPUwAAAPKbAAAiAgAAcQAAz5QIAgAA;
我必须创建新套接字才能将此请求写入internet,但套接字需要端口号和hostnameString才能连接

如果我们认为端口号总是80,那么从这个请求的哪个部分我必须得到主机名?这是什么http://mail.ru/ HTTP/1.1或主机:mail.ru

另外,我可以只发送到internet获取吗http://mail.ru/ HTTP/1.1放弃其他部分


最后一个问题是,我应该重写这个GET方法本身吗?

我已经创建了最简单的代理服务器。它的工作速度不是很快,但是:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;



/**
 *
 * @author 
 */
public class DaniyarProxyServer {
    public static final int port = 8000;

public static void main(String[] args) {
    ServerSocket listener = null;

    try {
        listener = new ServerSocket(port);
        System.out.println("Proxy started..");
        while (true) {
            try {
                Socket client = listener.accept();
                ClientHandler handler = new ClientHandler(client);
            } catch (Exception e) {
                System.err.println("Error: " + e.getMessage());
            }
        }
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}
}

class ClientHandler implements Runnable {

private Socket client;
private Socket internet;

private Thread thread;

public static int threadcount = 0;

private static int buffer_size = 8192;

private static String CRLF = "\r\n";

public int port = 80;

public ClientHandler(Socket client) {
    this.client = client;
    thread = new Thread(this, "Thread#" + threadcount);
    System.out.println("Thread#" + threadcount + " is running now");
    threadcount++;
    thread.run();
}

@Override
public void run() {
    try {
        byte[] buffer = new byte[buffer_size];
        BufferedInputStream clientIstream = new BufferedInputStream(client.getInputStream());
        clientIstream.read(buffer);

        String clientRequest = new String(buffer);

        System.out.println(clientRequest);

        String host = getHostFromRequest(clientRequest);

        internet = new Socket(host, port);
        BufferedOutputStream internetOstream = new BufferedOutputStream(internet.getOutputStream());
        internetOstream.write(clientRequest.getBytes());
        internetOstream.flush();

        BufferedOutputStream clientOstream = new BufferedOutputStream(client.getOutputStream());

        BufferedInputStream internetIstream = new BufferedInputStream(internet.getInputStream());

        buffer = new byte[buffer_size];
        int buffsize = 0;
        while ((buffsize = internetIstream.read(buffer)) != -1) {
            clientOstream.write(buffer, 0, buffsize);
        }
        clientOstream.flush();

        clientIstream.close();
        clientOstream.close();
        internetIstream.close();
        internetOstream.close();

    } catch (Exception e) {
        System.err.println("Exception " + e.getMessage());
    }
}


private String getHostFromRequest(String request) {
    String host = "";

    StringTokenizer tok = new StringTokenizer(request, CRLF);
    String method = tok.nextToken();
    host = tok.nextToken();

    host = host.substring("Host: ".length());

    return host;
}
}

如果是HTTP代理,则获取主机头。然后将所有数据传递给传出流,并将它们复制回传入流。顺便说一句,为了与浏览器有广泛的兼容性,你必须注意分块。好的,我将使用主机头,我应该重写得到HTTP/1.1吗?如何重写?只需将输入复制到目标输出即可实现基本功能。这是我大学的实验室工作。如果我记得的话,那很好。只需从计算机上运行它并检查它。