0

Java でプロキシ サーバーを作成しています。

最初に、私は(簡略化)

server = new ServerSocket(5568);
incoming = server.accept();
input = incoming.getInputStream();

...

outgoing = new Socket(host, 80);
output = outgoing.getOutputStream();
output.write(inputbuffer, 0, i);

ここで、inputbuffer は、これまでに受信したバイトのコレクションです (ホスト ヘッダーがわかっている部分まで着信データを読み取り、サーバーへの接続を開いて、これまでに取得したものを送信します)。したがって、サーバーはウェルカム ソケット、入力はクライアントからプロキシに送られるデータ、出力はプロキシからサーブへのデータです。

次に、サーバーからの出力を並行してクライアントに書き込み、クライアントがサーバーに書き込みを行う可能性があります。そこで、クライアントから読み取る別のスレッドを作成します。

final InputStream finalInput = input;
final OutputStream finalOutput = output;
Thread sendingStuff = new Thread(){
    public void run(){
        int c;
        while ((c = finalInput.read()) != -1){
            finalOutput.write((byte)c);
            finalOutput.flush();
        }
        finalInput.close();
        finalOutput.close();
    }
}
sendingStuff.start();

最後に、メイン スレッドに別のセクションを用意して、サーバーから読み取り、それをクライアントに書き込みます。

InputStream reverseInput = outgoing.getInputStream();
OutputStream reverseOutput = incoming.getOutputStream();
int c;
while ((c = reverseInput.read()) != -1){
    reverseOutput.write((byte)c);
    reverseOutput.flush();
}
reverseInput.close();
reverseOutput.close();

何が起こるかというと、入力を取得して出力を送信しますが、ブラウザーは永久にスピンし、クライアントから読み取っているスレッド内の行は -1 シグナルを受け取りません。

多くの場合、「無効なヘッダー名」や「サーバーが理解できないリクエストをブラウザが送信しました」などのエラーが表示されますが、これは私が抱えているこの問題に関係していると思います。クライアントから読み取る行で IOException: Socket Closed が発生したことさえありました。

では、なぜクライアントは EOF を送信しないのでしょうか? そして、これはこれを行う正しい方法ですか?

4

1 に答える 1