【问题标题】:Java: Handling browser's request in my ProxyServerJava:在我的代理服务器中处理浏览器的请求
【发布时间】:2014-03-04 11:04:27
【问题描述】:

我正在写ProxyServer,首先我使用ServerSocket 来获取与我连接的Socket。然后我从连接的Socket 得到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;

我必须创建新的Socket 才能将此请求写入互联网,但 Socket 需要端口号和主机名(字符串)才能连接。

如果我们认为端口号始终是80,那么我必须从该请求的哪一部分获取主机名?这是GET http://mail.ru/ HTTP/1.1 还是Host: mail.ru

另外,我可以只发送到互联网GET http://mail.ru/ HTTP/1.1 放弃其他部分吗?

最后一个问题是,我是否必须重写这个 GET 方法本身?

【问题讨论】:

  • 如果是HTTP代理,则获取HOST头。您将所有数据传递给传出流并将它们复制回传入流。顺便说一句,您必须注意分块才能与浏览器具有广泛的兼容性。
  • 好的,我将采用 Host 标头,我应该重写 GET mail.ru HTTP/1.1 吗?
  • 如何重写?只需将输入复制到目标输出即可获得基本功能。

标签: java sockets proxy


【解决方案1】:

我创建了最简单的代理服务器。它的工作速度不是那么快,但可以工作:)

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;
}
}

【讨论】:

  • 这是我大学的实验室工作。如果我记得,那效果很好。只需从您的计算机上运行它并检查它。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2018-12-20
  • 2018-12-13
  • 2020-07-10
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多