1

私は Java 言語は初めてですが、他のテクノロジについては十分な経験があります。

現在、プロキシサーバーの作成に取り組んでおり、単一のリクエストに対しては正常に動作するように見えるコードを思いつきましたが、多くの などをロードするページを開こうとすると、htmlリクエストの一部が中止されました (これはfirebugが私に言っていることです)stylesimages

そのため、コードを簡素化し、正確な問題を表示する際にできるだけ具体的にしようとします

メインクラスは次のとおりです。

public class ProxyThread {
    public static void main(String[] args) {
        ProxyThread Proxy = new ProxyThread();            
        Proxy.start();
    }

    public void start() {
        ServerSocket server = new ServerSocket(this.portNumber, 1);
        while(true) {
            Socket serverClient = server.accept();
            this._threads[threadCount] = new Thread( new RequestProcess( serverClient, threadCount++ ));
        }
    }
}

各リクエストの処理を行う RequestProcess のコードは次のとおりです

public class RequestProcess  implements Runnable {

    public void start()  throws InterruptedException {
        this.serverIn = new BufferedReader( new InputStreamReader( this.serverClient.getInputStream() ) );
        this.serverOut = this.serverClient.getOutputStream()   ;

        String currentBuffer;
        String request = "";
        String host = "";
        int port = 0;

        while ((currentBuffer = this.serverIn.readLine()) != null) {
                if (currentBuffer.length() == 0) {
                    break;
                }
                request += currentBuffer + "\r\n";

                if (currentBuffer.startsWith("CONNECT ") || currentBuffer.startsWith("GET ")) {
                    host = this.parseHost( currentBuffer );
                    port = this.parsePort( currentBuffer );    
                }     
        }    
        request += "\r\n";    
        if (host.isEmpty() || request.isEmpty()) {

            throw new InterruptedException("request or host empty, so exiting ");
        }    

        clientRequestProcess clientProcess = new clientRequestProcess( host, port, request, this.threadNum );

        byte[] response = clientProcess.processRequest();

        this.serverOut.write(response);
        this.serverOut.close();    
    }
}

そして、これがリクエストを処理して実際のサーバーに送信するクラスです

public class clientRequestProcess {    

    public byte[] processRequest()
    {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte buf[] = new byte[256*1024];

        Socket clientSocket = new Socket( host, port );   
        clientSocket.getOutputStream().write( request.getBytes() );
        InputStream is = clientSocket.getInputStream();

        int r = 1;
        while (r > 0) {
            r = is.read(buf);
            if (r > 0) {
                bos.write(buf, 0, r);      
            }
        }   
        return bos.toByteArray();
    }   
}

すべてのコードはドラフト 1 であり、それがどのように機能するかの全体像を示すために単純化されています。すべての try-catch ブロック、デバッグ情報などがここにありません。

手順 - JAVA プロキシを使用するようにブラウザーをセットアップします - いくつかのサイトを開きます - HTTP 要求の一部が正常に処理され、正しい応答が返されます -要求の一部が firebug で中止されたと表示されます。問題は、その部分が完全にランダムであるため、あるファイルがロードされると、別のファイルがロードされないことです。

コードのトラブルシューティングにより、リクエストの最初の行 (ブラウザからのリクエスト) が空であることがわかりました。

 if (currentBuffer.length() == 0) {
      break;
 }

ソケットの読み取りが中断されるため、ブラウザーに何も返さず、接続が中止されます

HTTP プロトコルで rfc を読んだところ、\r\n が満たされると https 要求は終了したと見なされることがわかりました。そのため、その条件を使用しています。そのファイルを別のタブで開くだけで、正常に読み込まれます。問題ありません。何回リロードしようとしていますか。しかし、一度に多数のファイルがロードされると、それらのランダムないくつかが中止されます。したがって、多くのファイルがロードされている場合、1つまたは3〜5個のファイルがロードされている場合にのみ発生します-すべてのファイルが正常にロードされます

何か案は?ありがとう

4

0 に答える 0