1

基本的なソケット プロキシ サーバーがあり、リダイレクト機能を追加したいと考えています。どうやって行けばいいの?クライアントから収集されたバッファには古い情報が含まれているため、ホストを変更するだけでは役に立ちません。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleProxyServer {

    public static final int portNumber = 5555;

    public static void main(String[] args) {
        SimpleProxyServer proxyServer = new SimpleProxyServer();
        proxyServer.start();

    }

    public void start() {
        System.out.println("Starting the SimpleProxyServer ...");
        try {

            ServerSocket serverSocket = new ServerSocket(
                    SimpleProxyServer.portNumber, 1);
            byte[] buffer = new byte[10000];

            while (true) {
                Socket clientSocket = serverSocket.accept();

                InputStream bis = clientSocket.getInputStream();


                int n = bis.read(buffer);
                String browserRequest = new String(buffer, 0, n);
                System.out.println(browserRequest);

                int start = browserRequest.indexOf("Host: ") + 6;
                int end = browserRequest.indexOf('\n', start);
                String host = browserRequest.substring(start, end - 1);
                System.out.println("Connecting to host " + host);


                Socket hostSocket = new Socket(host, 80); //I can change the host over here
                OutputStream sos = hostSocket.getOutputStream();
                System.out.println("Forwarding request to server");
                sos.write(buffer, 0, n);// but then the buffer that is fetched from the client remains same
                sos.flush();


                InputStream sis = hostSocket.getInputStream();
                OutputStream bos = clientSocket.getOutputStream();

                System.out.println("Forwarding request from server");

                do {
                    n = sis.read(buffer);
                    System.out.println("Receiving " + n + " bytes");
                    if (n > 0) {
                        bos.write(buffer, 0, n);
                    }
                } while (n > 0);

                bos.flush();
                hostSocket.close();
                clientSocket.close();
                System.out.println("End of communication");

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ここで私のクライアントはブラウザなので、バッファには大量のデータが含まれています。

browserRequest の例はどれでも

GET http://www.yahoo.com/ HTTP/1.0
Host: www.yahoo.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Proxy-Connection: close
Cookie: B=c6r6cn99536pm&b=3&s=ha; fpc=d=mEdlILxMtEbSZkEHT9nArn_LmO6DBF2HC4aZWnYvepTQpHb86MidH7bPbylrLChwtcznc4rZnUWz5R_xvFr6WJYcYJnpG_aBqekaFtBKsmCUsblQQtM1ivZpRz7m6PYiQtwtcoGVAs55IhfOy0eaqXdfEif8ZkXrgpiYjmy2Qm_wkORpT5tXcZKJ.nKcMcUqh7aoTVA-&v=2; MSC=t=1381079862X; BILLBOARD=nv=1&bn=0&collapsed=0; ypcdb=e5e21a3dacf7b87ec358a08261d310ec

次回 while ループが繰り返されると、browserRequest は次のようになります。

GET http://in.yahoo.com/?p=us HTTP/1.0
Host: in.yahoo.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Proxy-Connection: close
Cookie: B=c6r6cn99536pm&b=3&s=ha; MSC=t=1381079862X; fpc=d=NVQLQy5MtEYnypFx54.9vMbBB6hMzgZBTkPUzrh5pyN7MdDAbbwV96dq9xhvHLfj_A.DBwRKIwUiufAsj8Gs1EBtj3slZb31KrhNjPe5lEAgMlEeXUijTqpYZnFWROwAFjCqcd_4SV90e1XEu87kCBT7Lb1rzodBKY1ZUHmC57O0QEJWL8rJJcEcaODEc.69elh3CaiKmaxkP5rwWbx0FK15ZCCYbJROMwwFXovaYBfR.Re27s4saqnUCBQSFI3Ro80k_ci5&v=2; fpps=_page=%7B%22wsid%22%3A%2221445690%22%7D; fpt=d=DV0PgAXXeVzrfc2GezJLqQPfzZiyGbbBhDpW.vmTd6yHOqDQACyQiLPWz..0N0jUP35Yo9S9Yw8rMuXlE9gjZ1Ra3MhzyfnyMN67b_8cb7d7NbRceZS4AzDaVqbHB_9Tfyeznojpm3AuzqGUdfG2fnoMVl4OqKM_a7Mt3vV8U4Qr38gB864WFl6NXOyz7n_T1FA89lQfsWVob0oOzuXWNfieD_jikxauj.3nFDkbkFH6qATpBXHLGP7OvE7ibc0IL.66u7kDDaawvEOSSyh1tv3LhSrYshHS5MfslHpkSUJsP4lIBNxcQQRJWBmw27rl9mfg.R7vAOQwFHi6_24D0XtQDhKntlO2sWSCplscG35S353IBzPRZranUwp_fYP3XuePv6E8yAkENSCbmx5..vjQTLOMEEf5mUlNmFvQoxSRzlvoG5vAdRcPmELlbxs6MZxMd822gifvP063z9dF8lNRWZTcK8Mfq0ob4XSUplzWbbY6lb2yJIZ57ddogxHo6phfy59RqLqFPWSb38a9K3UU0TSjPDEg9wjfFmmdew--&v=1; fpc_s=d=2smDyqJMtEb.MYIbCNo48GeCPgKDD8rlRWYK4yILeDPeL8Rmu.M9oX3wGvweGpvAQBcYSlyjemeKTeHpqOmaDGC.eKT3dwzmsyUMo48OZJEkv2z_fkIIMkipQJsEMCFngcwJ8tJL_R2hZBS6Z3MjJwmD28zABdGjrhJ71RmXmfkj6Ofas8R4UkkcXvyGgVsyGKxOeYip45UMltDfVpBa7SNz_GAcrhtpvlV6PRjF4ffKxTpAdx5uGiXok_5S7UmGpD8iQR.SOkZ0uhAr3iBl6wpoVGIHvPvOqPaZ8pAJApGQwmp85Ul3uJYqpXanb0B.WxaiyUXr6DlQBzUVrXHcn0Pm5_pQ6yATqiq0jBzsQqZNDAC8JAqecLmgRQUa7E_7B60IsEwV7TIq1mDdNhDgIk5lbIncWwLYVmoUyPxI0.UYcPJW&v=2; FPCK2=AgBSUZsQABPEEABFMhAARIgQAGMC; BILLBOARD=nv=1&bn=0&collapsed=0; ypcdb=e5e21a3dacf7b87ec358a08261d310ec

www.yahoo.com のリクエストを www.google.com にリダイレクトしたいだけです。

どうすればこれを達成できますか? 私が見ることができるのは、クライアント/ブラウザーから受信したバッファーを編集できないためです。

4

2 に答える 2

0

私は同じ問題を抱えていますが、サーブレットによるリクエスト/レスポンスのキャプチャを解決しようとしています。このhttp://www.tidytutorials.com/2009/12/simple-java-proxy-servlet-using.htmlを試して、URL をリダイレクトするように変更してください。応答は最高ではありません (画像、css、および js はレンダリングされません) が、Content-type を変更することで解決できます。

于 2014-10-03T02:18:04.270 に答える
0

コンテンツについて何もする必要はありません。クライアントは、現在プロキシしている URL へのリクエストをルーティングしたのと同じ方法で、埋め込まれた URL へのリクエストをルーティングします。

于 2013-10-06T21:07:17.880 に答える